summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorLiam P. White <inkscapebrony@gmail.com>2014-10-29 22:40:05 +0000
committerLiam P. White <inkscapebrony@gmail.com>2014-10-29 22:40:05 +0000
commite9943b70c7bf507b9639ecb0a421bcee7ce93e33 (patch)
tree2d2fe7ee7a566e1ef1a5dcde18296d9f21188f35 /src
parenti18n. Fixing untranslated strings. (diff)
parentMerge with trunk r13640 (diff)
downloadinkscape-e9943b70c7bf507b9639ecb0a421bcee7ce93e33.tar.gz
inkscape-e9943b70c7bf507b9639ecb0a421bcee7ce93e33.zip
Merge experimental
(bzr r13641)
Diffstat (limited to 'src')
-rw-r--r--src/2geom/numeric/symmetric-matrix-fs-operation.h2
-rw-r--r--src/2geom/numeric/symmetric-matrix-fs-trace.h2
-rw-r--r--src/CMakeLists.txt26
-rw-r--r--src/Makefile.am4
-rw-r--r--src/Makefile_insert21
-rw-r--r--src/attribute-rel-util.h2
-rw-r--r--src/attributes.cpp15
-rw-r--r--src/attributes.h2
-rw-r--r--src/axis-manip.cpp15
-rw-r--r--src/axis-manip.h37
-rw-r--r--src/box3d-side.h8
-rw-r--r--src/box3d.h20
-rw-r--r--src/cms-color-types.h5
-rw-r--r--src/cms-system.h8
-rw-r--r--src/color-profile.h21
-rw-r--r--src/color-rgba.h5
-rw-r--r--src/color.cpp46
-rw-r--r--src/color.h6
-rw-r--r--src/conn-avoid-ref.h2
-rw-r--r--src/connection-pool.h84
-rw-r--r--src/context-fns.cpp13
-rw-r--r--src/context-fns.h15
-rw-r--r--src/debug/gdk-event-latency-tracker.cpp2
-rw-r--r--src/debug/gdk-event-latency-tracker.h2
-rw-r--r--src/debug/log-display-config.cpp6
-rw-r--r--src/desktop-events.cpp62
-rw-r--r--src/desktop-events.h8
-rw-r--r--src/desktop-style.cpp1
-rw-r--r--src/desktop-style.h3
-rw-r--r--src/desktop.cpp4
-rw-r--r--src/desktop.h5
-rw-r--r--src/dialogs/CMakeLists.txt11
-rw-r--r--src/dialogs/Makefile_insert5
-rw-r--r--src/dialogs/makefile.in17
-rw-r--r--src/dir-util.h6
-rw-r--r--src/display/cairo-templates.h3
-rw-r--r--src/display/cairo-utils.cpp97
-rw-r--r--src/display/cairo-utils.h9
-rw-r--r--src/display/canvas-arena.cpp35
-rw-r--r--src/display/canvas-arena.h8
-rw-r--r--src/display/canvas-axonomgrid.h8
-rw-r--r--src/display/canvas-bpath.cpp37
-rw-r--r--src/display/canvas-grid.cpp36
-rw-r--r--src/display/canvas-grid.h10
-rw-r--r--src/display/canvas-temporary-item-list.cpp5
-rw-r--r--src/display/canvas-temporary-item-list.h5
-rw-r--r--src/display/canvas-temporary-item.cpp8
-rw-r--r--src/display/canvas-temporary-item.h11
-rw-r--r--src/display/canvas-text.cpp39
-rw-r--r--src/display/curve.cpp36
-rw-r--r--src/display/curve.h38
-rw-r--r--src/display/drawing-context.h6
-rw-r--r--src/display/drawing-group.cpp3
-rw-r--r--src/display/drawing-image.cpp4
-rw-r--r--src/display/drawing-item.cpp11
-rw-r--r--src/display/drawing-item.h8
-rw-r--r--src/display/drawing-shape.cpp2
-rw-r--r--src/display/drawing-surface.h7
-rw-r--r--src/display/drawing-text.cpp7
-rw-r--r--src/display/drawing.h12
-rw-r--r--src/display/gnome-canvas-acetate.cpp29
-rw-r--r--src/display/gnome-canvas-acetate.h8
-rw-r--r--src/display/grayscale.cpp4
-rw-r--r--src/display/grayscale.h6
-rw-r--r--src/display/guideline.cpp34
-rw-r--r--src/display/nr-3dutils.h11
-rw-r--r--src/display/nr-filter-blend.cpp1
-rw-r--r--src/display/nr-filter-blend.h4
-rw-r--r--src/display/nr-filter-colormatrix.h15
-rw-r--r--src/display/nr-filter-component-transfer.h6
-rw-r--r--src/display/nr-filter-composite.h4
-rw-r--r--src/display/nr-filter-convolve-matrix.h8
-rw-r--r--src/display/nr-filter-diffuselighting.h10
-rw-r--r--src/display/nr-filter-displacement-map.h4
-rw-r--r--src/display/nr-filter-flood.h5
-rw-r--r--src/display/nr-filter-gaussian.h4
-rw-r--r--src/display/nr-filter-image.h8
-rw-r--r--src/display/nr-filter-merge.h4
-rw-r--r--src/display/nr-filter-morphology.h4
-rw-r--r--src/display/nr-filter-offset.h4
-rw-r--r--src/display/nr-filter-primitive.h3
-rw-r--r--src/display/nr-filter-skeleton.h4
-rw-r--r--src/display/nr-filter-slot.h10
-rw-r--r--src/display/nr-filter-specularlighting.h12
-rw-r--r--src/display/nr-filter-tile.h4
-rw-r--r--src/display/nr-filter-turbulence.h5
-rw-r--r--src/display/nr-filter-types.h4
-rw-r--r--src/display/nr-filter-units.h4
-rw-r--r--src/display/nr-filter-utils.h7
-rw-r--r--src/display/nr-filter.cpp2
-rw-r--r--src/display/nr-filter.h4
-rw-r--r--src/display/nr-light-types.h4
-rw-r--r--src/display/nr-light.cpp8
-rw-r--r--src/display/nr-light.h34
-rw-r--r--src/display/nr-svgfonts.h55
-rw-r--r--src/display/snap-indicator.cpp2
-rw-r--r--src/display/sodipodi-ctrl.cpp37
-rw-r--r--src/display/sodipodi-ctrlrect.cpp38
-rw-r--r--src/display/sodipodi-ctrlrect.h4
-rw-r--r--src/display/sp-canvas-item.h12
-rw-r--r--src/display/sp-canvas-util.h6
-rw-r--r--src/display/sp-canvas.cpp112
-rw-r--r--src/display/sp-canvas.h10
-rw-r--r--src/display/sp-ctrlcurve.cpp41
-rw-r--r--src/display/sp-ctrlcurve.h9
-rw-r--r--src/display/sp-ctrlline.cpp40
-rw-r--r--src/display/sp-ctrlline.h6
-rw-r--r--src/display/sp-ctrlpoint.cpp35
-rw-r--r--src/display/sp-ctrlquadr.cpp34
-rw-r--r--src/document-private.h1
-rw-r--r--src/document-undo.cpp15
-rw-r--r--src/document-undo.h5
-rw-r--r--src/document.cpp2
-rw-r--r--src/document.h56
-rw-r--r--src/ege-color-prof-tracker.cpp9
-rw-r--r--src/event-log.h8
-rw-r--r--src/extension/implementation/script.cpp2
-rw-r--r--src/extension/implementation/script.h80
-rw-r--r--src/extension/input.h5
-rw-r--r--src/extension/internal/cairo-render-context.h3
-rw-r--r--src/extension/internal/cairo-renderer.cpp2
-rw-r--r--src/extension/internal/cdr-input.cpp8
-rw-r--r--src/extension/internal/emf-inout.cpp2
-rw-r--r--src/extension/internal/gdkpixbuf-input.cpp21
-rw-r--r--src/extension/internal/gdkpixbuf-input.h2
-rw-r--r--src/extension/internal/metafile-inout.cpp6
-rw-r--r--src/extension/internal/pdfinput/pdf-input.cpp2
-rw-r--r--src/extension/internal/vsd-input.cpp8
-rw-r--r--src/extension/internal/wmf-inout.cpp1
-rw-r--r--src/extension/output.h1
-rw-r--r--src/extension/prefdialog.cpp2
-rw-r--r--src/extension/system.cpp2
-rw-r--r--src/extract-uri.h4
-rw-r--r--src/factory.h2
-rw-r--r--src/file.cpp12
-rw-r--r--src/file.h8
-rw-r--r--src/filter-chemistry.cpp2
-rw-r--r--src/filter-chemistry.h9
-rw-r--r--src/filter-enums.cpp1
-rw-r--r--src/filters/distantlight.h12
-rw-r--r--src/filters/pointlight.h16
-rw-r--r--src/filters/spotlight.h36
-rw-r--r--src/gc-anchored.h1
-rw-r--r--src/gc-core.h1
-rw-r--r--src/gradient-chemistry.h21
-rw-r--r--src/graphlayout.h13
-rw-r--r--src/guide-snapper.cpp2
-rw-r--r--src/help.cpp19
-rw-r--r--src/help.h20
-rw-r--r--src/helper-fns.h30
-rw-r--r--src/helper/action.h6
-rw-r--r--src/helper/geom.cpp53
-rw-r--r--src/helper/gnome-utils.cpp148
-rw-r--r--src/helper/gnome-utils.h14
-rw-r--r--src/helper/pixbuf-ops.cpp2
-rw-r--r--src/helper/png-write.cpp2
-rw-r--r--src/helper/stock-items.cpp2
-rw-r--r--src/helper/window.cpp62
-rw-r--r--src/helper/window.h19
-rw-r--r--src/icon-size.h2
-rw-r--r--src/inkscape-version.h2
-rw-r--r--src/inkscape.cpp124
-rw-r--r--src/inkscape.h15
-rw-r--r--src/inkview.cpp14
-rw-r--r--src/isinf.h2
-rw-r--r--src/isnormal.h19
-rw-r--r--src/knot-holder-entity.h30
-rw-r--r--src/knot-ptr.cpp25
-rw-r--r--src/knot-ptr.h8
-rw-r--r--src/knot.cpp14
-rw-r--r--src/knot.h64
-rw-r--r--src/knotholder.cpp15
-rw-r--r--src/knotholder.h18
-rw-r--r--src/layer-manager.h11
-rw-r--r--src/layer-model.h6
-rw-r--r--src/libdepixelize/kopftracer2011.h1
-rw-r--r--src/libnrtype/FontFactory.cpp1
-rw-r--r--src/libnrtype/Layout-TNG-Compute.cpp2
-rw-r--r--src/libnrtype/font-lister.cpp2
-rw-r--r--src/libnrtype/nr-type-primitives.cpp151
-rw-r--r--src/libnrtype/nr-type-primitives.h21
-rw-r--r--src/line-geometry.h5
-rw-r--r--src/line-snapper.cpp5
-rw-r--r--src/line-snapper.h5
-rw-r--r--src/livarot/PathStroke.cpp18
-rw-r--r--src/live_effects/CMakeLists.txt29
-rw-r--r--src/live_effects/Makefile_insert34
-rw-r--r--src/live_effects/effect-enum.h15
-rw-r--r--src/live_effects/effect.cpp124
-rw-r--r--src/live_effects/effect.h12
-rw-r--r--src/live_effects/lpe-attach-path.cpp198
-rw-r--r--src/live_effects/lpe-attach-path.h52
-rw-r--r--src/live_effects/lpe-bendpath.cpp3
-rw-r--r--src/live_effects/lpe-bounding-box.cpp67
-rw-r--r--src/live_effects/lpe-bounding-box.h37
-rw-r--r--src/live_effects/lpe-bspline.cpp663
-rw-r--r--src/live_effects/lpe-bspline.h56
-rw-r--r--src/live_effects/lpe-copy_rotate.cpp1
-rw-r--r--src/live_effects/lpe-ellipse_5pts.cpp214
-rw-r--r--src/live_effects/lpe-ellipse_5pts.h50
-rw-r--r--src/live_effects/lpe-envelope.cpp5
-rw-r--r--src/live_effects/lpe-fill-between-many.cpp78
-rw-r--r--src/live_effects/lpe-fill-between-many.h36
-rw-r--r--src/live_effects/lpe-fill-between-strokes.cpp116
-rw-r--r--src/live_effects/lpe-fill-between-strokes.h38
-rw-r--r--src/live_effects/lpe-fillet-chamfer.cpp649
-rw-r--r--src/live_effects/lpe-fillet-chamfer.h101
-rw-r--r--src/live_effects/lpe-interpolate_points.cpp94
-rw-r--r--src/live_effects/lpe-interpolate_points.h51
-rw-r--r--src/live_effects/lpe-jointype.cpp190
-rw-r--r--src/live_effects/lpe-jointype.h57
-rw-r--r--src/live_effects/lpe-knot.cpp5
-rw-r--r--src/live_effects/lpe-knot.h3
-rw-r--r--src/live_effects/lpe-lattice.cpp3
-rw-r--r--src/live_effects/lpe-lattice.h1
-rw-r--r--src/live_effects/lpe-lattice2.cpp499
-rw-r--r--src/live_effects/lpe-lattice2.h92
-rw-r--r--src/live_effects/lpe-mirror_symmetry.cpp8
-rw-r--r--src/live_effects/lpe-mirror_symmetry.h2
-rw-r--r--src/live_effects/lpe-offset.cpp8
-rw-r--r--src/live_effects/lpe-offset.h2
-rw-r--r--src/live_effects/lpe-perspective-envelope.cpp387
-rw-r--r--src/live_effects/lpe-perspective-envelope.h70
-rw-r--r--src/live_effects/lpe-perspective_path.cpp14
-rw-r--r--src/live_effects/lpe-powerstroke-interpolators.h53
-rw-r--r--src/live_effects/lpe-powerstroke.cpp100
-rw-r--r--src/live_effects/lpe-powerstroke.h2
-rw-r--r--src/live_effects/lpe-roughen.cpp339
-rw-r--r--src/live_effects/lpe-roughen.h63
-rw-r--r--src/live_effects/lpe-show_handles.cpp211
-rw-r--r--src/live_effects/lpe-show_handles.h61
-rw-r--r--src/live_effects/lpe-simplify.cpp292
-rw-r--r--src/live_effects/lpe-simplify.h59
-rw-r--r--src/live_effects/lpe-tangent_to_curve.cpp19
-rw-r--r--src/live_effects/lpe-tangent_to_curve.h1
-rw-r--r--src/live_effects/lpe-taperstroke.cpp632
-rw-r--r--src/live_effects/lpe-taperstroke.h72
-rw-r--r--src/live_effects/lpe-vonkoch.cpp3
-rw-r--r--src/live_effects/lpeobject-reference.h6
-rw-r--r--src/live_effects/lpeobject.h4
-rw-r--r--src/live_effects/parameter/Makefile_insert10
-rw-r--r--src/live_effects/parameter/bool.h2
-rw-r--r--src/live_effects/parameter/filletchamferpointarray.cpp882
-rw-r--r--src/live_effects/parameter/filletchamferpointarray.h123
-rw-r--r--src/live_effects/parameter/originalpatharray.cpp487
-rw-r--r--src/live_effects/parameter/originalpatharray.h122
-rw-r--r--src/live_effects/parameter/parameter.cpp29
-rw-r--r--src/live_effects/parameter/path.cpp4
-rw-r--r--src/live_effects/parameter/pointreseteable.cpp210
-rw-r--r--src/live_effects/parameter/pointreseteable.h74
-rw-r--r--src/live_effects/parameter/powerstrokepointarray.cpp45
-rw-r--r--src/live_effects/parameter/powerstrokepointarray.h25
-rw-r--r--src/live_effects/parameter/togglebutton.cpp172
-rw-r--r--src/live_effects/parameter/togglebutton.h77
-rw-r--r--src/live_effects/parameter/transformedpoint.cpp182
-rw-r--r--src/live_effects/parameter/transformedpoint.h82
-rw-r--r--src/live_effects/pathoutlineprovider.cpp803
-rw-r--r--src/live_effects/pathoutlineprovider.h55
-rw-r--r--src/macros.h11
-rw-r--r--src/main-cmdlineact.h6
-rw-r--r--src/main.cpp2
-rw-r--r--src/menus-skeleton.h3
-rw-r--r--src/message-context.h15
-rw-r--r--src/message-stack.h31
-rw-r--r--src/number-opt-number.h30
-rw-r--r--src/object-hierarchy.cpp23
-rw-r--r--src/object-hierarchy.h3
-rw-r--r--src/path-chemistry.cpp8
-rw-r--r--src/path-chemistry.h5
-rw-r--r--src/path-prefix.h16
-rw-r--r--src/persp3d-reference.h7
-rw-r--r--src/persp3d.h15
-rw-r--r--src/perspective-line.cpp6
-rw-r--r--src/perspective-line.h1
-rw-r--r--src/preferences-skeleton.h3
-rw-r--r--src/preferences.h6
-rw-r--r--src/prefix.cpp6
-rw-r--r--src/print.h6
-rw-r--r--src/profile-manager.h5
-rw-r--r--src/proj_pt.cpp20
-rw-r--r--src/proj_pt.h28
-rw-r--r--src/rdf.h39
-rw-r--r--src/removeoverlap.h2
-rw-r--r--src/rubberband.h10
-rw-r--r--src/satisfied-guide-cns.h2
-rw-r--r--src/selcue.h8
-rw-r--r--src/selection-chemistry.cpp207
-rw-r--r--src/selection-chemistry.h31
-rw-r--r--src/selection-describer.h6
-rw-r--r--src/selection.h21
-rw-r--r--src/seltrans-handles.h14
-rw-r--r--src/seltrans.h67
-rw-r--r--src/shape-editor.cpp255
-rw-r--r--src/shape-editor.h95
-rw-r--r--src/shortcuts.h11
-rw-r--r--src/snap-candidate.h5
-rw-r--r--src/snap-preferences.h18
-rw-r--r--src/snap.cpp4
-rw-r--r--src/snap.h1
-rw-r--r--src/snapped-curve.h6
-rw-r--r--src/snapped-point.h7
-rw-r--r--src/snapper.h13
-rw-r--r--src/sp-anchor.h14
-rw-r--r--src/sp-clippath.h21
-rw-r--r--src/sp-conn-end-pair.h18
-rw-r--r--src/sp-conn-end.h13
-rw-r--r--src/sp-cursor.cpp9
-rw-r--r--src/sp-cursor.h9
-rw-r--r--src/sp-defs.h2
-rw-r--r--src/sp-desc.h6
-rw-r--r--src/sp-ellipse.cpp33
-rw-r--r--src/sp-ellipse.h22
-rw-r--r--src/sp-filter-primitive.cpp5
-rw-r--r--src/sp-filter-primitive.h12
-rw-r--r--src/sp-filter.cpp5
-rw-r--r--src/sp-filter.h17
-rw-r--r--src/sp-flowdiv.h26
-rw-r--r--src/sp-flowregion.h8
-rw-r--r--src/sp-flowtext.h10
-rw-r--r--src/sp-font-face.h12
-rw-r--r--src/sp-font.h8
-rw-r--r--src/sp-glyph-kerning.cpp133
-rw-r--r--src/sp-glyph-kerning.h73
-rw-r--r--src/sp-glyph.cpp162
-rw-r--r--src/sp-glyph.h48
-rw-r--r--src/sp-gradient-vector.h5
-rw-r--r--src/sp-gradient.cpp21
-rw-r--r--src/sp-gradient.h48
-rw-r--r--src/sp-guide-constraint.h2
-rw-r--r--src/sp-guide.cpp336
-rw-r--r--src/sp-guide.h78
-rw-r--r--src/sp-image.cpp1
-rw-r--r--src/sp-image.h13
-rw-r--r--src/sp-item-group.cpp12
-rw-r--r--src/sp-item-group.h25
-rw-r--r--src/sp-item-notify-moveto.cpp11
-rw-r--r--src/sp-item-transform.cpp2
-rw-r--r--src/sp-item-transform.h9
-rw-r--r--src/sp-item.cpp42
-rw-r--r--src/sp-item.h42
-rw-r--r--src/sp-line.h6
-rw-r--r--src/sp-linear-gradient.cpp2
-rw-r--r--src/sp-linear-gradient.h4
-rw-r--r--src/sp-lpe-item.cpp127
-rw-r--r--src/sp-lpe-item.h17
-rw-r--r--src/sp-marker.cpp (renamed from src/marker.cpp)2
-rw-r--r--src/sp-marker.h (renamed from src/marker.h)10
-rw-r--r--src/sp-mask.h16
-rw-r--r--src/sp-mesh-array.cpp16
-rw-r--r--src/sp-mesh-array.h64
-rw-r--r--src/sp-mesh-gradient.cpp6
-rw-r--r--src/sp-mesh-gradient.h4
-rw-r--r--src/sp-mesh-patch.h6
-rw-r--r--src/sp-mesh-row.h5
-rw-r--r--src/sp-metadata.h9
-rw-r--r--src/sp-missing-glyph.h12
-rw-r--r--src/sp-namedview.cpp18
-rw-r--r--src/sp-namedview.h29
-rw-r--r--src/sp-object-group.h2
-rw-r--r--src/sp-object.cpp16
-rw-r--r--src/sp-object.h84
-rw-r--r--src/sp-offset.h18
-rw-r--r--src/sp-paint-server-reference.h3
-rw-r--r--src/sp-paint-server.cpp1
-rw-r--r--src/sp-path.h10
-rw-r--r--src/sp-pattern.cpp21
-rw-r--r--src/sp-pattern.h39
-rw-r--r--src/sp-polygon.h13
-rw-r--r--src/sp-polyline.h6
-rw-r--r--src/sp-radial-gradient.cpp2
-rw-r--r--src/sp-radial-gradient.h8
-rw-r--r--src/sp-rect.h32
-rw-r--r--src/sp-root.h8
-rw-r--r--src/sp-script.h10
-rw-r--r--src/sp-shape.cpp2
-rw-r--r--src/sp-shape.h16
-rw-r--r--src/sp-solid-color.cpp2
-rw-r--r--src/sp-solid-color.h8
-rw-r--r--src/sp-spiral.h16
-rw-r--r--src/sp-star.h18
-rw-r--r--src/sp-stop.h13
-rw-r--r--src/sp-string.h4
-rw-r--r--src/sp-style-elem.h4
-rw-r--r--src/sp-switch.h10
-rw-r--r--src/sp-symbol.h18
-rw-r--r--src/sp-tag-use-reference.cpp156
-rw-r--r--src/sp-tag-use-reference.h78
-rw-r--r--src/sp-tag-use.cpp206
-rw-r--r--src/sp-tag-use.h55
-rw-r--r--src/sp-tag.cpp154
-rw-r--r--src/sp-tag.h57
-rw-r--r--src/sp-text.cpp30
-rw-r--r--src/sp-text.h24
-rw-r--r--src/sp-textpath.h7
-rw-r--r--src/sp-title.h6
-rw-r--r--src/sp-tref-reference.h8
-rw-r--r--src/sp-tref.h6
-rw-r--r--src/sp-tspan.h7
-rw-r--r--src/sp-use-reference.h8
-rw-r--r--src/sp-use.h15
-rw-r--r--src/splivarot.cpp2
-rw-r--r--src/splivarot.h7
-rw-r--r--src/streq.h1
-rw-r--r--src/style-enums.h6
-rw-r--r--src/style-internal.h2
-rw-r--r--src/style.cpp1
-rw-r--r--src/style.h35
-rw-r--r--src/svg-view-widget.cpp64
-rw-r--r--src/svg-view-widget.h2
-rw-r--r--src/svg-view.h13
-rw-r--r--src/svg/css-ostringstream.h5
-rw-r--r--src/svg/path-string.h4
-rw-r--r--src/svg/stringstream.h5
-rw-r--r--src/svg/svg-color.h13
-rw-r--r--src/svg/svg-length.cpp13
-rw-r--r--src/svg/svg-length.h24
-rw-r--r--src/svg/svg-path.cpp51
-rw-r--r--src/svg/svg.h24
-rw-r--r--src/text-chemistry.h2
-rw-r--r--src/text-editing.h19
-rw-r--r--src/transf_mat_3x4.h4
-rw-r--r--src/ui/CMakeLists.txt15
-rw-r--r--src/ui/Makefile_insert13
-rw-r--r--src/ui/clipboard.cpp4
-rw-r--r--src/ui/dialog-events.cpp (renamed from src/dialogs/dialog-events.cpp)4
-rw-r--r--src/ui/dialog-events.h (renamed from src/dialogs/dialog-events.h)6
-rw-r--r--src/ui/dialog/Makefile_insert8
-rw-r--r--src/ui/dialog/aboutbox.cpp6
-rw-r--r--src/ui/dialog/aboutbox.h6
-rw-r--r--src/ui/dialog/align-and-distribute.cpp6
-rw-r--r--src/ui/dialog/calligraphic-profile-rename.h2
-rw-r--r--src/ui/dialog/clonetiler.cpp6
-rw-r--r--src/ui/dialog/clonetiler.h5
-rw-r--r--src/ui/dialog/color-item.cpp2
-rw-r--r--src/ui/dialog/desktop-tracker.cpp2
-rw-r--r--src/ui/dialog/desktop-tracker.h5
-rw-r--r--src/ui/dialog/dialog-manager.cpp10
-rw-r--r--src/ui/dialog/dialog.cpp20
-rw-r--r--src/ui/dialog/dialog.h4
-rw-r--r--src/ui/dialog/dock-behavior.cpp4
-rw-r--r--src/ui/dialog/document-metadata.cpp4
-rw-r--r--src/ui/dialog/document-metadata.h4
-rw-r--r--src/ui/dialog/document-properties.cpp8
-rw-r--r--src/ui/dialog/document-properties.h4
-rw-r--r--src/ui/dialog/export.cpp4
-rw-r--r--src/ui/dialog/export.h9
-rw-r--r--src/ui/dialog/extension-editor.cpp2
-rw-r--r--src/ui/dialog/filedialog.cpp2
-rw-r--r--src/ui/dialog/filedialog.h1
-rw-r--r--src/ui/dialog/filedialogimpl-gtkmm.cpp47
-rw-r--r--src/ui/dialog/filedialogimpl-win32.cpp3
-rw-r--r--src/ui/dialog/filedialogimpl-win32.h3
-rw-r--r--src/ui/dialog/fill-and-stroke.h2
-rw-r--r--src/ui/dialog/find.cpp4
-rw-r--r--src/ui/dialog/floating-behavior.cpp4
-rw-r--r--src/ui/dialog/font-substitution.cpp2
-rw-r--r--src/ui/dialog/grid-arrange-tab.cpp2
-rw-r--r--src/ui/dialog/grid-arrange-tab.h8
-rw-r--r--src/ui/dialog/guides.cpp23
-rw-r--r--src/ui/dialog/inkscape-preferences.h4
-rw-r--r--src/ui/dialog/lpe-fillet-chamfer-properties.cpp278
-rw-r--r--src/ui/dialog/lpe-fillet-chamfer-properties.h110
-rw-r--r--src/ui/dialog/lpe-powerstroke-properties.cpp211
-rw-r--r--src/ui/dialog/lpe-powerstroke-properties.h99
-rw-r--r--src/ui/dialog/new-from-template.cpp15
-rw-r--r--src/ui/dialog/objects.cpp2144
-rw-r--r--src/ui/dialog/objects.h263
-rw-r--r--src/ui/dialog/ocaldialogs.cpp4
-rw-r--r--src/ui/dialog/ocaldialogs.h3
-rw-r--r--src/ui/dialog/panel-dialog.h12
-rw-r--r--src/ui/dialog/polar-arrange-tab.cpp32
-rw-r--r--src/ui/dialog/polar-arrange-tab.h19
-rw-r--r--src/ui/dialog/spellcheck.cpp78
-rw-r--r--src/ui/dialog/swatches.cpp103
-rw-r--r--src/ui/dialog/swatches.h2
-rw-r--r--src/ui/dialog/tags.cpp1165
-rw-r--r--src/ui/dialog/tags.h181
-rw-r--r--src/ui/dialog/template-load-tab.cpp2
-rw-r--r--src/ui/dialog/text-edit.cpp2
-rw-r--r--src/ui/dialog/transformation.cpp4
-rw-r--r--src/ui/dialog/xml-tree.cpp4
-rw-r--r--src/ui/draw-anchor.cpp (renamed from src/draw-anchor.cpp)6
-rw-r--r--src/ui/draw-anchor.h (renamed from src/draw-anchor.h)9
-rw-r--r--src/ui/interface.cpp (renamed from src/interface.cpp)17
-rw-r--r--src/ui/interface.h (renamed from src/interface.h)19
-rw-r--r--src/ui/object-edit.cpp (renamed from src/object-edit.cpp)146
-rw-r--r--src/ui/object-edit.h (renamed from src/object-edit.h)5
-rw-r--r--src/ui/shape-editor.cpp177
-rw-r--r--src/ui/shape-editor.h71
-rw-r--r--src/ui/tool-factory.h (renamed from src/tool-factory.h)0
-rw-r--r--src/ui/tool/control-point-selection.cpp49
-rw-r--r--src/ui/tool/control-point-selection.h13
-rw-r--r--src/ui/tool/curve-drag-point.cpp17
-rw-r--r--src/ui/tool/multi-path-manipulator.cpp21
-rw-r--r--src/ui/tool/multi-path-manipulator.h5
-rw-r--r--src/ui/tool/node.cpp248
-rw-r--r--src/ui/tool/node.h23
-rw-r--r--src/ui/tool/path-manipulator.cpp173
-rw-r--r--src/ui/tool/path-manipulator.h12
-rw-r--r--src/ui/tool/selectable-control-point.h1
-rw-r--r--src/ui/tools-switch.cpp (renamed from src/tools-switch.cpp)55
-rw-r--r--src/ui/tools-switch.h (renamed from src/tools-switch.h)0
-rw-r--r--src/ui/tools/arc-tool.cpp10
-rw-r--r--src/ui/tools/arc-tool.h2
-rw-r--r--src/ui/tools/box3d-tool.cpp10
-rw-r--r--src/ui/tools/calligraphic-tool.cpp2
-rw-r--r--src/ui/tools/connector-tool.cpp2
-rw-r--r--src/ui/tools/dropper-tool.cpp2
-rw-r--r--src/ui/tools/eraser-tool.cpp2
-rw-r--r--src/ui/tools/flood-tool.cpp10
-rw-r--r--src/ui/tools/flood-tool.h4
-rw-r--r--src/ui/tools/freehand-base.cpp100
-rw-r--r--src/ui/tools/freehand-base.h6
-rw-r--r--src/ui/tools/gradient-tool.cpp19
-rw-r--r--src/ui/tools/lpe-tool.cpp11
-rw-r--r--src/ui/tools/measure-tool.cpp2
-rw-r--r--src/ui/tools/mesh-tool.cpp2
-rw-r--r--src/ui/tools/node-tool.cpp22
-rw-r--r--src/ui/tools/node-tool.h3
-rw-r--r--src/ui/tools/pen-tool.cpp995
-rw-r--r--src/ui/tools/pen-tool.h31
-rw-r--r--src/ui/tools/pencil-tool.cpp48
-rw-r--r--src/ui/tools/rect-tool.cpp10
-rw-r--r--src/ui/tools/select-tool.cpp4
-rw-r--r--src/ui/tools/select-tool.h1
-rw-r--r--src/ui/tools/spiral-tool.cpp10
-rw-r--r--src/ui/tools/spiral-tool.h8
-rw-r--r--src/ui/tools/spray-tool.cpp2
-rw-r--r--src/ui/tools/star-tool.cpp10
-rw-r--r--src/ui/tools/text-tool.cpp10
-rw-r--r--src/ui/tools/text-tool.h7
-rw-r--r--src/ui/tools/tool-base.cpp8
-rw-r--r--src/ui/tools/tool-base.h4
-rw-r--r--src/ui/tools/tweak-tool.cpp2
-rw-r--r--src/ui/tools/zoom-tool.cpp2
-rw-r--r--src/ui/view/view-widget.cpp31
-rw-r--r--src/ui/widget/Makefile_insert13
-rw-r--r--src/ui/widget/addtoicon.cpp157
-rw-r--r--src/ui/widget/addtoicon.h98
-rw-r--r--src/ui/widget/anchor-selector.cpp16
-rw-r--r--src/ui/widget/anchor-selector.h20
-rw-r--r--src/ui/widget/button.cpp6
-rw-r--r--src/ui/widget/button.h6
-rw-r--r--src/ui/widget/clipmaskicon.cpp184
-rw-r--r--src/ui/widget/clipmaskicon.h102
-rw-r--r--src/ui/widget/color-picker.cpp2
-rw-r--r--src/ui/widget/entity-entry.cpp4
-rw-r--r--src/ui/widget/entity-entry.h4
-rw-r--r--src/ui/widget/filter-effect-chooser.cpp2
-rw-r--r--src/ui/widget/filter-effect-chooser.h4
-rw-r--r--src/ui/widget/highlight-picker.cpp207
-rw-r--r--src/ui/widget/highlight-picker.h90
-rw-r--r--src/ui/widget/insertordericon.cpp165
-rw-r--r--src/ui/widget/insertordericon.h100
-rw-r--r--src/ui/widget/layertypeicon.cpp174
-rw-r--r--src/ui/widget/layertypeicon.h108
-rw-r--r--src/ui/widget/licensor.cpp4
-rw-r--r--src/ui/widget/licensor.h4
-rw-r--r--src/ui/widget/notebook-page.cpp6
-rw-r--r--src/ui/widget/notebook-page.h6
-rw-r--r--src/ui/widget/object-composite-settings.cpp4
-rw-r--r--src/ui/widget/object-composite-settings.h6
-rw-r--r--src/ui/widget/page-sizer.cpp4
-rw-r--r--src/ui/widget/page-sizer.h4
-rw-r--r--src/ui/widget/panel.cpp4
-rw-r--r--src/ui/widget/panel.h12
-rw-r--r--src/ui/widget/preferences-widget.cpp8
-rw-r--r--src/ui/widget/preferences-widget.h4
-rw-r--r--src/ui/widget/registered-widget.cpp57
-rw-r--r--src/ui/widget/registered-widget.h29
-rw-r--r--src/ui/widget/registry.cpp4
-rw-r--r--src/ui/widget/registry.h4
-rw-r--r--src/ui/widget/rotateable.cpp6
-rw-r--r--src/ui/widget/rotateable.h4
-rw-r--r--src/ui/widget/selected-style.cpp25
-rw-r--r--src/ui/widget/selected-style.h17
-rw-r--r--src/ui/widget/spin-scale.cpp6
-rw-r--r--src/ui/widget/spin-scale.h6
-rw-r--r--src/ui/widget/spin-slider.cpp6
-rw-r--r--src/ui/widget/spin-slider.h6
-rw-r--r--src/ui/widget/spinbutton.cpp6
-rw-r--r--src/ui/widget/spinbutton.h6
-rw-r--r--src/ui/widget/style-swatch.cpp4
-rw-r--r--src/ui/widget/style-swatch.h6
-rw-r--r--src/ui/widget/tolerance-slider.cpp4
-rw-r--r--src/ui/widget/tolerance-slider.h4
-rw-r--r--src/ui/widget/unit-menu.cpp6
-rw-r--r--src/ui/widget/unit-menu.h4
-rw-r--r--src/ui/widget/unit-tracker.cpp2
-rw-r--r--src/ui/widget/unit-tracker.h7
-rw-r--r--src/unclump.cpp1
-rw-r--r--src/unclump.h2
-rw-r--r--src/unicoderange.h14
-rw-r--r--src/uri-references.cpp6
-rw-r--r--src/uri-references.h14
-rw-r--r--src/uri.h35
-rw-r--r--src/vanishing-point.cpp2
-rw-r--r--src/vanishing-point.h12
-rw-r--r--src/verbs.cpp99
-rw-r--r--src/verbs.h54
-rw-r--r--src/version.cpp22
-rw-r--r--src/version.h12
-rw-r--r--src/widgets/CMakeLists.txt10
-rw-r--r--src/widgets/Makefile_insert10
-rw-r--r--src/widgets/arc-toolbar.cpp28
-rw-r--r--src/widgets/box3d-toolbar.cpp24
-rw-r--r--src/widgets/button.cpp381
-rw-r--r--src/widgets/button.h31
-rw-r--r--src/widgets/calligraphy-toolbar.cpp6
-rw-r--r--src/widgets/connector-toolbar.cpp4
-rw-r--r--src/widgets/dash-selector.cpp2
-rw-r--r--src/widgets/desktop-widget.cpp6
-rw-r--r--src/widgets/dropper-toolbar.cpp4
-rw-r--r--src/widgets/eek-preview.h1
-rw-r--r--src/widgets/ege-adjustment-action.cpp (renamed from src/ege-adjustment-action.cpp)2
-rw-r--r--src/widgets/ege-adjustment-action.h (renamed from src/ege-adjustment-action.h)2
-rw-r--r--src/widgets/ege-output-action.cpp (renamed from src/ege-output-action.cpp)2
-rw-r--r--src/widgets/ege-output-action.h (renamed from src/ege-output-action.h)2
-rw-r--r--src/widgets/ege-select-one-action.cpp (renamed from src/ege-select-one-action.cpp)2
-rw-r--r--src/widgets/ege-select-one-action.h (renamed from src/ege-select-one-action.h)2
-rw-r--r--src/widgets/eraser-toolbar.cpp6
-rw-r--r--src/widgets/font-selector.cpp48
-rw-r--r--src/widgets/font-selector.h4
-rw-r--r--src/widgets/gradient-image.cpp56
-rw-r--r--src/widgets/gradient-image.h30
-rw-r--r--src/widgets/gradient-selector.cpp54
-rw-r--r--src/widgets/gradient-selector.h31
-rw-r--r--src/widgets/gradient-toolbar.cpp6
-rw-r--r--src/widgets/gradient-vector.cpp72
-rw-r--r--src/widgets/gradient-vector.h16
-rw-r--r--src/widgets/icon.cpp5
-rw-r--r--src/widgets/icon.h8
-rw-r--r--src/widgets/ink-action.cpp (renamed from src/ink-action.cpp)2
-rw-r--r--src/widgets/ink-action.h (renamed from src/ink-action.h)2
-rw-r--r--src/widgets/ink-comboboxentry-action.cpp (renamed from src/ink-comboboxentry-action.cpp)2
-rw-r--r--src/widgets/ink-comboboxentry-action.h (renamed from src/ink-comboboxentry-action.h)4
-rw-r--r--src/widgets/lpe-toolbar.cpp41
-rw-r--r--src/widgets/mappings.xml1
-rw-r--r--src/widgets/measure-toolbar.cpp4
-rw-r--r--src/widgets/mesh-toolbar.cpp88
-rw-r--r--src/widgets/node-toolbar.cpp51
-rw-r--r--src/widgets/paint-selector.cpp101
-rw-r--r--src/widgets/paint-selector.h18
-rw-r--r--src/widgets/paintbucket-toolbar.cpp6
-rw-r--r--src/widgets/pencil-toolbar.cpp16
-rw-r--r--src/widgets/rect-toolbar.cpp28
-rw-r--r--src/widgets/select-toolbar.cpp6
-rw-r--r--src/widgets/sp-color-icc-selector.cpp45
-rw-r--r--src/widgets/sp-color-icc-selector.h2
-rw-r--r--src/widgets/sp-color-notebook.cpp50
-rw-r--r--src/widgets/sp-color-notebook.h4
-rw-r--r--src/widgets/sp-color-scales.cpp54
-rw-r--r--src/widgets/sp-color-scales.h5
-rw-r--r--src/widgets/sp-color-selector.cpp42
-rw-r--r--src/widgets/sp-color-selector.h12
-rw-r--r--src/widgets/sp-color-slider.cpp30
-rw-r--r--src/widgets/sp-color-slider.h7
-rw-r--r--src/widgets/sp-color-wheel-selector.cpp54
-rw-r--r--src/widgets/sp-color-wheel-selector.h5
-rw-r--r--src/widgets/sp-widget.cpp79
-rw-r--r--src/widgets/sp-widget.h18
-rw-r--r--src/widgets/sp-xmlview-attr-list.cpp34
-rw-r--r--src/widgets/sp-xmlview-attr-list.h3
-rw-r--r--src/widgets/sp-xmlview-content.cpp34
-rw-r--r--src/widgets/sp-xmlview-content.h3
-rw-r--r--src/widgets/sp-xmlview-tree.cpp42
-rw-r--r--src/widgets/sp-xmlview-tree.h17
-rw-r--r--src/widgets/spinbutton-events.h4
-rw-r--r--src/widgets/spiral-toolbar.cpp6
-rw-r--r--src/widgets/spray-toolbar.cpp6
-rw-r--r--src/widgets/spw-utilities.cpp11
-rw-r--r--src/widgets/star-toolbar.cpp31
-rw-r--r--src/widgets/stroke-marker-selector.cpp4
-rw-r--r--src/widgets/stroke-style.cpp2
-rw-r--r--src/widgets/stroke-style.h6
-rw-r--r--src/widgets/text-toolbar.cpp10
-rw-r--r--src/widgets/toolbox.cpp14
-rw-r--r--src/widgets/toolbox.h6
-rw-r--r--src/widgets/tweak-toolbar.cpp8
-rw-r--r--src/xml/event.h2
-rw-r--r--src/xml/helper-observer.h70
-rw-r--r--src/xml/node-event-vector.h42
-rw-r--r--src/xml/node-observer.h6
-rw-r--r--src/xml/node.h15
-rw-r--r--src/xml/pi-node.h1
-rw-r--r--src/xml/quote.h2
-rw-r--r--src/xml/rebase-hrefs.h9
-rw-r--r--src/xml/repr.h85
-rw-r--r--src/xml/simple-node.h18
689 files changed, 22607 insertions, 5596 deletions
diff --git a/src/2geom/numeric/symmetric-matrix-fs-operation.h b/src/2geom/numeric/symmetric-matrix-fs-operation.h
index 5222d2734..37ece56ae 100644
--- a/src/2geom/numeric/symmetric-matrix-fs-operation.h
+++ b/src/2geom/numeric/symmetric-matrix-fs-operation.h
@@ -44,7 +44,7 @@ namespace Geom { namespace NL {
template <size_t N>
inline
-SymmetricMatrix<N> adj(const ConstBaseSymmetricMatrix<N> & S)
+SymmetricMatrix<N> adj(const ConstBaseSymmetricMatrix<N> & /*S*/)
{
THROW_NOTIMPLEMENTED();
return SymmetricMatrix<N>();
diff --git a/src/2geom/numeric/symmetric-matrix-fs-trace.h b/src/2geom/numeric/symmetric-matrix-fs-trace.h
index 099c834a8..dbabecf6e 100644
--- a/src/2geom/numeric/symmetric-matrix-fs-trace.h
+++ b/src/2geom/numeric/symmetric-matrix-fs-trace.h
@@ -74,7 +74,7 @@ template <size_t K, size_t N>
struct trace
{
static
- double evaluate (const ConstBaseSymmetricMatrix<N> & S)
+ double evaluate (const ConstBaseSymmetricMatrix<N> & /*S*/)
{
THROW_NOTIMPLEMENTED();
return K;
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 25556e3bc..1455b762e 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -44,6 +44,7 @@ set(sp_SRC
sp-line.cpp
sp-linear-gradient.cpp
sp-lpe-item.cpp
+ sp-marker.cpp
sp-mask.cpp
sp-mesh-array.cpp
sp-mesh-gradient.cpp
@@ -129,6 +130,7 @@ set(sp_SRC
sp-line.h
sp-linear-gradient.h
sp-lpe-item.h
+ sp-marker.h
sp-marker-loc.h
sp-mask.h
sp-mesh-array.h
@@ -194,11 +196,7 @@ set(inkscape_SRC
document-undo.cpp
document.cpp
doxygen-main.cpp
- draw-anchor.cpp
- ege-adjustment-action.cpp
ege-color-prof-tracker.cpp
- ege-output-action.cpp
- ege-select-one-action.cpp
event-log.cpp
extract-uri.cpp
file.cpp
@@ -214,26 +212,23 @@ set(inkscape_SRC
help.cpp
id-clash.cpp
# ige-mac-menu.c
- ink-action.cpp
- ink-comboboxentry-action.cpp
inkscape.cpp
inkscape.rc
interface.cpp
knot-holder-entity.cpp
knot.cpp
knotholder.cpp
+ knot-ptr.cpp
layer-fns.cpp
layer-manager.cpp
layer-model.cpp
line-geometry.cpp
line-snapper.cpp
main-cmdlineact.cpp
- marker.cpp
media.cpp
message-context.cpp
message-stack.cpp
mod360.cpp
- object-edit.cpp
object-hierarchy.cpp
object-snapper.cpp
path-chemistry.cpp
@@ -256,7 +251,6 @@ set(inkscape_SRC
selection.cpp
seltrans-handles.cpp
seltrans.cpp
- shape-editor.cpp
shortcuts.cpp
snap-preferences.cpp
snap.cpp
@@ -270,7 +264,6 @@ set(inkscape_SRC
svg-view.cpp
text-chemistry.cpp
text-editing.cpp
- tools-switch.cpp
transf_mat_3x4.cpp
unclump.cpp
unicoderange.cpp
@@ -302,7 +295,6 @@ set(inkscape_SRC
composite-undo-stack-observer.h
conditions.h
conn-avoid-ref.h
- connection-pool.h
console-output-undo-observer.h
context-fns.h
decimal-round.h
@@ -317,11 +309,7 @@ set(inkscape_SRC
document-subset.h
document-undo.h
document.h
- draw-anchor.h
- ege-adjustment-action.h
ege-color-prof-tracker.h
- ege-output-action.h
- ege-select-one-action.h
enums.h
event-log.h
event.h
@@ -348,18 +336,16 @@ set(inkscape_SRC
icon-size.h
id-clash.h
# ige-mac-menu.h
- ink-action.h
- ink-comboboxentry-action.h
inkscape-private.h
inkscape-version.h
inkscape.h
interface.h
isinf.h
- isnormal.h
knot-enums.h
knot-holder-entity.h
knot.h
knotholder.h
+ knot-ptr.h
layer-fns.h
layer-manager.h
layer-model.h
@@ -377,7 +363,6 @@ set(inkscape_SRC
mod360-test.h
mod360.h
number-opt-number.h
- object-edit.h
object-hierarchy.h
object-snapper.h
path-chemistry.h
@@ -408,7 +393,6 @@ set(inkscape_SRC
selection.h
seltrans-handles.h
seltrans.h
- shape-editor.h
shortcuts.h
snap-candidate.h
snap-enums.h
@@ -433,8 +417,6 @@ set(inkscape_SRC
text-chemistry.h
text-editing.h
text-tag-attributes.h
- tool-factory.h
- tools-switch.h
transf_mat_3x4.h
unclump.h
undo-stack-observer.h
diff --git a/src/Makefile.am b/src/Makefile.am
index bb34047a8..8fb7e23ef 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -105,7 +105,6 @@ endif
# Include all partial makefiles from subdirectories
include Makefile_insert
-include dialogs/Makefile_insert
include display/Makefile_insert
include extension/Makefile_insert
include extension/dbus/Makefile_insert
@@ -144,7 +143,6 @@ include libdepixelize/Makefile_insert
EXTRA_DIST += \
2geom/makefile.in \
debug/makefile.in \
- dialogs/makefile.in \
display/makefile.in \
extension/implementation/makefile.in \
extension/internal/makefile.in \
@@ -220,7 +218,7 @@ endif
# someone updates the BZR working directory.
inkscape-version.cpp: $(inkscape_version_deps)
VER_PREFIX="$(VERSION)";\
- VER_BZRREV=" r`bzr revno --tree`"; \
+ VER_BZRREV=" r`bzr revno --tree $(top_srcdir)`"; \
if test ! -z "`bzr status -S -V $(srcdir)`"; then \
VER_CUSTOM=" custom"; \
fi; \
diff --git a/src/Makefile_insert b/src/Makefile_insert
index 66188f502..2fff44cb8 100644
--- a/src/Makefile_insert
+++ b/src/Makefile_insert
@@ -24,7 +24,6 @@ ink_common_sources += \
composite-undo-stack-observer.h \
conditions.cpp conditions.h \
conn-avoid-ref.cpp conn-avoid-ref.h \
- connection-pool.h \
console-output-undo-observer.h console-output-undo-observer.cpp \
context-fns.cpp context-fns.h \
decimal-round.h \
@@ -38,11 +37,7 @@ ink_common_sources += \
document-subset.cpp document-subset.h \
document-undo.cpp document-undo.h \
doxygen-main.cpp \
- draw-anchor.cpp draw-anchor.h \
- ege-adjustment-action.cpp ege-adjustment-action.h \
ege-color-prof-tracker.cpp ege-color-prof-tracker.h \
- ege-output-action.cpp ege-output-action.h \
- ege-select-one-action.cpp ege-select-one-action.h \
enums.h \
event-log.cpp event-log.h event.h \
extract-uri.cpp extract-uri.h \
@@ -68,18 +63,13 @@ ink_common_sources += \
helper/pixbuf-ops.h \
icon-size.h \
id-clash.cpp id-clash.h \
- ink-action.cpp \
- ink-action.h \
- ink-comboboxentry-action.cpp \
- ink-comboboxentry-action.h \
inkscape.cpp inkscape.h inkscape-private.h \
- interface.cpp interface.h \
isinf.h \
- isnormal.h \
knot.cpp knot.h \
knot-enums.h \
knotholder.cpp knotholder.h \
knot-holder-entity.h knot-holder-entity.cpp \
+ knot-ptr.h knot-ptr.cpp \
layer-fns.cpp layer-fns.h \
layer-manager.cpp layer-manager.h \
layer-model.cpp layer-model.h \
@@ -87,14 +77,12 @@ ink_common_sources += \
line-snapper.cpp line-snapper.h \
macros.h \
main-cmdlineact.cpp main-cmdlineact.h \
- marker.cpp marker.h \
media.cpp media.h \
menus-skeleton.h \
message-context.cpp message-context.h \
message.h \
message-stack.cpp message-stack.h \
mod360.cpp mod360.h \
- object-edit.cpp object-edit.h \
object-hierarchy.cpp object-hierarchy.h \
object-snapper.cpp object-snapper.h \
path-chemistry.cpp path-chemistry.h \
@@ -121,7 +109,6 @@ ink_common_sources += \
selection-describer.cpp selection-describer.h \
seltrans.cpp seltrans.h \
seltrans-handles.cpp seltrans-handles.h \
- shape-editor.cpp shape-editor.h \
shortcuts.cpp shortcuts.h \
snap.cpp snap.h \
snap-enums.h snap-candidate.h \
@@ -171,6 +158,7 @@ ink_common_sources += \
sp-line.cpp sp-line.h \
splivarot.cpp splivarot.h \
sp-lpe-item.cpp sp-lpe-item.h \
+ sp-marker.cpp sp-marker.h \
sp-marker-loc.h \
sp-mask.cpp sp-mask.h \
sp-metadata.cpp sp-metadata.h \
@@ -202,6 +190,9 @@ ink_common_sources += \
sp-style-elem.cpp sp-style-elem.h \
sp-switch.cpp sp-switch.h \
sp-symbol.cpp sp-symbol.h \
+ sp-tag.cpp sp-tag.h \
+ sp-tag-use.cpp sp-tag-use.h \
+ sp-tag-use-reference.cpp sp-tag-use-reference.h \
sp-text.cpp sp-text.h \
sp-textpath.h \
sp-title.cpp sp-title.h \
@@ -222,8 +213,6 @@ ink_common_sources += \
text-chemistry.cpp text-chemistry.h \
text-editing.cpp text-editing.h \
text-tag-attributes.h \
- tool-factory.h \
- tools-switch.cpp tools-switch.h \
transf_mat_3x4.cpp transf_mat_3x4.h \
unclump.cpp unclump.h \
undo-stack-observer.h \
diff --git a/src/attribute-rel-util.h b/src/attribute-rel-util.h
index 3a6661965..604987779 100644
--- a/src/attribute-rel-util.h
+++ b/src/attribute-rel-util.h
@@ -8,7 +8,7 @@
* Author: tavmjong
*/
-#include "glibmm/ustring.h"
+#include <glibmm/ustring.h>
#include "xml/sp-css-attr.h"
using Inkscape::XML::Node;
diff --git a/src/attributes.cpp b/src/attributes.cpp
index aa17c581b..d142d1a06 100644
--- a/src/attributes.cpp
+++ b/src/attributes.cpp
@@ -1,9 +1,4 @@
-#define __SP_ATTRIBUTES_C__
-
-/** \file
- * Lookup dictionary for attributes/properties.
- */
-/*
+/**
* Author:
* Lauris Kaplinski <lauris@kaplinski.com>
*
@@ -25,6 +20,10 @@ typedef struct {
gchar const *name;
} SPStyleProp;
+/**
+ * Lookup dictionary for attributes/properties.
+ */
+
static SPStyleProp const props[] = {
{SP_ATTR_INVALID, NULL},
/* SPObject */
@@ -41,6 +40,7 @@ static SPStyleProp const props[] = {
{SP_ATTR_TRANSFORM_CENTER_X, "inkscape:transform-center-x"},
{SP_ATTR_TRANSFORM_CENTER_Y, "inkscape:transform-center-y"},
{SP_ATTR_INKSCAPE_PATH_EFFECT, "inkscape:path-effect"},
+ {SP_ATTR_INKSCAPE_HIGHLIGHT_COLOR, "inkscape:highlight-color"},
/* SPAnchor */
{SP_ATTR_XLINK_HREF, "xlink:href"},
{SP_ATTR_XLINK_TYPE, "xlink:type"},
@@ -51,6 +51,7 @@ static SPStyleProp const props[] = {
{SP_ATTR_XLINK_ACTUATE, "xlink:actuate"},
{SP_ATTR_TARGET, "target"},
{SP_ATTR_INKSCAPE_GROUPMODE, "inkscape:groupmode"},
+ {SP_ATTR_INKSCAPE_EXPANDED, "inkscape:expanded"},
/* SPRoot */
{SP_ATTR_VERSION, "version"},
{SP_ATTR_WIDTH, "width"},
@@ -544,4 +545,4 @@ sp_attribute_name(unsigned int id)
fill-column:99
End:
*/
-// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8 :
diff --git a/src/attributes.h b/src/attributes.h
index 6594f1bbd..8e091df71 100644
--- a/src/attributes.h
+++ b/src/attributes.h
@@ -40,6 +40,7 @@ enum SPAttributeEnum {
SP_ATTR_TRANSFORM_CENTER_X,
SP_ATTR_TRANSFORM_CENTER_Y,
SP_ATTR_INKSCAPE_PATH_EFFECT,
+ SP_ATTR_INKSCAPE_HIGHLIGHT_COLOR,
/* SPAnchor */
SP_ATTR_XLINK_HREF,
SP_ATTR_XLINK_TYPE,
@@ -51,6 +52,7 @@ enum SPAttributeEnum {
SP_ATTR_TARGET,
/* SPGroup */
SP_ATTR_INKSCAPE_GROUPMODE,
+ SP_ATTR_INKSCAPE_EXPANDED,
/* SPRoot */
SP_ATTR_VERSION,
SP_ATTR_WIDTH,
diff --git a/src/axis-manip.cpp b/src/axis-manip.cpp
index 1dfa0e6bf..8955202c8 100644
--- a/src/axis-manip.cpp
+++ b/src/axis-manip.cpp
@@ -1,6 +1,4 @@
-#define __AXIS_MANIP_C__
-
-/*
+/**
* Generic auxiliary routines for 3D axes
*
* Authors:
@@ -11,6 +9,7 @@
* Released under GNU GPL, read the file 'COPYING' for more information
*/
+#include <glib.h>
#include "axis-manip.h"
namespace Proj {
@@ -33,6 +32,14 @@ get_remaining_axes (Axis axis) {
return std::make_pair (extract_first_axis_direction (plane), extract_second_axis_direction (plane));
}
+char * string_from_axes (Box3D::Axis axis) {
+ GString *pstring = g_string_new("");
+ if (axis & Box3D::X) g_string_append_printf (pstring, "X");
+ if (axis & Box3D::Y) g_string_append_printf (pstring, "Y");
+ if (axis & Box3D::Z) g_string_append_printf (pstring, "Z");
+ return pstring->str;
+}
+
} // namespace Box3D
/*
@@ -44,4 +51,4 @@ get_remaining_axes (Axis axis) {
fill-column:99
End:
*/
-// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8 :
diff --git a/src/axis-manip.h b/src/axis-manip.h
index 9392e2ddd..5e245939e 100644
--- a/src/axis-manip.h
+++ b/src/axis-manip.h
@@ -12,8 +12,9 @@
#ifndef SEEN_AXIS_MANIP_H
#define SEEN_AXIS_MANIP_H
+#include <cassert>
+#include <string>
#include <utility>
-#include <gtk/gtk.h>
namespace Proj {
@@ -34,7 +35,7 @@ enum Axis {
extern Axis axes[4];
-inline gchar const *
+inline char const*
string_from_axis(Proj::Axis axis) {
switch (axis) {
case X: return "X"; break;
@@ -77,18 +78,15 @@ inline int axis_to_int(Box3D::Axis axis) {
switch (axis) {
case Box3D::X:
return 0;
- break;
case Box3D::Y:
return 1;
- break;
case Box3D::Z:
return 2;
- break;
case Box3D::NONE:
return -1;
- break;
default:
- g_assert_not_reached();
+ assert(false);
+ return -1; // help compiler's flow analysis (-Werror=return-value)
}
}
@@ -103,7 +101,8 @@ inline Proj::Axis toProj(Box3D::Axis axis) {
case Box3D::NONE:
return Proj::NONE;
default:
- g_assert_not_reached();
+ assert(false);
+ return Proj::NONE; // help compiler's flow analysis (-Werror=return-value)
}
}
@@ -126,7 +125,8 @@ inline Box3D::Axis toAffine(Proj::Axis axis) {
case Proj::NONE:
return Box3D::NONE;
default:
- g_assert_not_reached();
+ assert(false);
+ return Box3D::NONE; // help compiler's flow analysis (-Werror=return-value)
}
}
@@ -144,7 +144,7 @@ namespace Box3D {
// (which is normally used to index an array). Return -1 if the bit sequence
// does not specify a face. A face can either be given by its plane (e.g, XY)
// or by the axis that is orthogonal to it (e.g., Z).
-inline gint face_to_int (guint face_id) {
+inline int face_to_int (unsigned int face_id) {
switch (face_id) {
case 1: return 0;
case 2: return 1;
@@ -164,7 +164,7 @@ inline gint face_to_int (guint face_id) {
}
}
-inline gint int_to_face (guint id) {
+inline int int_to_face (unsigned id) {
switch (id) {
case 0: return Box3D::YZ ^ Box3D::FRONT;
case 1: return Box3D::XZ ^ Box3D::FRONT;
@@ -176,7 +176,7 @@ inline gint int_to_face (guint id) {
return Box3D::NONE; // should not be reached
}
-inline bool is_face_id (guint face_id) {
+inline bool is_face_id (unsigned int face_id) {
return !((face_id & 0x7) == 0x7);
}
@@ -186,8 +186,8 @@ inline gint opposite_face (guint face_id) {
}
**/
-inline guint number_of_axis_directions (Box3D::Axis axis) {
- guint num = 0;
+inline unsigned int number_of_axis_directions (Box3D::Axis axis) {
+ unsigned int num = 0;
if (axis & Box3D::X) num++;
if (axis & Box3D::Y) num++;
if (axis & Box3D::Z) num++;
@@ -238,14 +238,7 @@ inline Box3D::Axis get_perpendicular_axis_direction (Box3D::Axis dirs) {
return Box3D::NONE;
}
-inline gchar * string_from_axes (Box3D::Axis axis) {
- GString *pstring = g_string_new("");
- if (axis & Box3D::X) g_string_append_printf (pstring, "X");
- if (axis & Box3D::Y) g_string_append_printf (pstring, "Y");
- if (axis & Box3D::Z) g_string_append_printf (pstring, "Z");
- return pstring->str;
-}
-
+char * string_from_axes (Box3D::Axis axis);
std::pair <Axis, Axis> get_remaining_axes (Axis axis);
} // namespace Box3D
diff --git a/src/box3d-side.h b/src/box3d-side.h
index 519ed495e..4783a5f24 100644
--- a/src/box3d-side.h
+++ b/src/box3d-side.h
@@ -34,16 +34,16 @@ public:
static Box3DSide * createBox3DSide(SPBox3D *box);
virtual void build(SPDocument* doc, Inkscape::XML::Node* repr);
- virtual void set(unsigned int key, gchar const* value);
- virtual Inkscape::XML::Node* write(Inkscape::XML::Document *xml_doc, Inkscape::XML::Node *repr, guint flags);
- virtual void update(SPCtx *ctx, guint flags);
+ virtual void set(unsigned int key, char const* value);
+ virtual Inkscape::XML::Node* write(Inkscape::XML::Document *xml_doc, Inkscape::XML::Node *repr, unsigned int flags);
+ virtual void update(SPCtx *ctx, unsigned int flags);
virtual void set_shape();
};
void box3d_side_position_set (Box3DSide *side); // FIXME: Replace this by box3d_side_set_shape??
-gchar *box3d_side_axes_string(Box3DSide *side);
+char *box3d_side_axes_string(Box3DSide *side);
Persp3D *box3d_side_perspective(Box3DSide *side);
diff --git a/src/box3d.h b/src/box3d.h
index 55b3eb2fc..85f481e5b 100644
--- a/src/box3d.h
+++ b/src/box3d.h
@@ -31,9 +31,9 @@ public:
SPBox3D();
virtual ~SPBox3D();
- gint z_orders[6]; // z_orders[i] holds the ID of the face at position #i in the group (from top to bottom)
+ int z_orders[6]; // z_orders[i] holds the ID of the face at position #i in the group (from top to bottom)
- gchar *persp_href;
+ char *persp_href;
Persp3DReference *persp_ref;
Proj::Pt3 orig_corner0;
@@ -44,7 +44,7 @@ public:
Box3D::Axis swapped; // to indicate which coordinates are swapped during dragging
- gint my_counter; // for debugging only
+ int my_counter; // for debugging only
/**
* Create a SPBox3D and append it to the parent.
@@ -53,24 +53,24 @@ public:
virtual void build(SPDocument *document, Inkscape::XML::Node *repr);
virtual void release();
- virtual void set(unsigned int key, gchar const* value);
- virtual void update(SPCtx *ctx, guint flags);
- virtual Inkscape::XML::Node* write(Inkscape::XML::Document *xml_doc, Inkscape::XML::Node *repr, guint flags);
+ virtual void set(unsigned int key, char const* value);
+ virtual void update(SPCtx *ctx, unsigned int flags);
+ virtual Inkscape::XML::Node* write(Inkscape::XML::Document *xml_doc, Inkscape::XML::Node *repr, unsigned int flags);
virtual const char* display_name();
virtual Geom::Affine set_transform(Geom::Affine const &transform);
virtual void convert_to_guides() const;
virtual const char* displayName() const;
- virtual gchar *description() const;
+ virtual char *description() const;
};
void box3d_position_set (SPBox3D *box);
-Proj::Pt3 box3d_get_proj_corner (SPBox3D const *box, guint id);
-Geom::Point box3d_get_corner_screen (SPBox3D const *box, guint id, bool item_coords = true);
+Proj::Pt3 box3d_get_proj_corner (SPBox3D const *box, unsigned int id);
+Geom::Point box3d_get_corner_screen (SPBox3D const *box, unsigned int id, bool item_coords = true);
Proj::Pt3 box3d_get_proj_center (SPBox3D *box);
Geom::Point box3d_get_center_screen (SPBox3D *box);
-void box3d_set_corner (SPBox3D *box, guint id, Geom::Point const &new_pos, Box3D::Axis movement, bool constrained);
+void box3d_set_corner (SPBox3D *box, unsigned int id, Geom::Point const &new_pos, Box3D::Axis movement, bool constrained);
void box3d_set_center (SPBox3D *box, Geom::Point const &new_pos, Geom::Point const &old_pos, Box3D::Axis movement, bool constrained);
void box3d_corners_for_PLs (const SPBox3D * box, Proj::Axis axis, Geom::Point &corner1, Geom::Point &corner2, Geom::Point &corner3, Geom::Point &corner4);
bool box3d_recompute_z_orders (SPBox3D *box);
diff --git a/src/cms-color-types.h b/src/cms-color-types.h
index 47157c243..b94c96029 100644
--- a/src/cms-color-types.h
+++ b/src/cms-color-types.h
@@ -10,15 +10,14 @@
# include "config.h"
#endif // HAVE_CONFIG_H
-#include <glib.h>
-
#if HAVE_LIBLCMS1
# include <icc34.h>
#endif
#if HAVE_STDINT_H
-# include <stdint.h>
+# include <stdint.h> // uint8_t, etc
#endif
+typedef unsigned int guint32;
typedef void * cmsHPROFILE;
typedef void * cmsHTRANSFORM;
diff --git a/src/cms-system.h b/src/cms-system.h
index c528deb94..73d1a89c4 100644
--- a/src/cms-system.h
+++ b/src/cms-system.h
@@ -5,8 +5,6 @@
* Macros and fn declarations related to linear gradients.
*/
-#include <glib-object.h>
-#include <glib.h>
#include <vector>
#include <glibmm/ustring.h>
#include "cms-color-types.h"
@@ -19,13 +17,13 @@ class ColorProfile;
class CMSSystem {
public:
- static cmsHPROFILE getHandle( SPDocument* document, guint* intent, gchar const* name );
+ static cmsHPROFILE getHandle( SPDocument* document, unsigned int* intent, char const* name );
static cmsHTRANSFORM getDisplayTransform();
static Glib::ustring getDisplayId( int screen, int monitor );
- static Glib::ustring setDisplayPer( gpointer buf, guint bufLen, int screen, int monitor );
+ static Glib::ustring setDisplayPer( void* buf, unsigned int bufLen, int screen, int monitor );
static cmsHTRANSFORM getDisplayPer( Glib::ustring const& id );
@@ -39,7 +37,7 @@ public:
static bool isPrintColorSpace(ColorProfile const *profile);
- static gint getChannelCount(ColorProfile const *profile);
+ static int getChannelCount(ColorProfile const *profile);
};
diff --git a/src/color-profile.h b/src/color-profile.h
index 2da757b91..cb6b25945 100644
--- a/src/color-profile.h
+++ b/src/color-profile.h
@@ -2,7 +2,6 @@
#define SEEN_COLOR_PROFILE_H
#include <vector>
-#include <glib.h>
#include <sp-object.h>
#include <glibmm/ustring.h>
#include "cms-color-types.h"
@@ -31,7 +30,7 @@ public:
ColorProfile();
virtual ~ColorProfile();
- friend cmsHPROFILE colorprofile_get_handle( SPDocument*, guint*, gchar const* );
+ friend cmsHPROFILE colorprofile_get_handle( SPDocument*, unsigned int*, char const* );
friend class CMSSystem;
static std::vector<Glib::ustring> getBaseProfileDirs();
@@ -49,21 +48,21 @@ public:
#endif // defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2)
- gchar* href;
- gchar* local;
- gchar* name;
- gchar* intentStr;
- guint rendering_intent;
+ char* href;
+ char* local;
+ char* name;
+ char* intentStr;
+ unsigned int rendering_intent; // FIXME: type the enum and hold that instead
protected:
ColorProfileImpl *impl;
- virtual void build(SPDocument* doc, Inkscape::XML::Node* repr);
- virtual void release();
+ virtual void build(SPDocument* doc, Inkscape::XML::Node* repr);
+ virtual void release();
- virtual void set(unsigned int key, const gchar* value);
+ virtual void set(unsigned int key, char const* value);
- virtual Inkscape::XML::Node* write(Inkscape::XML::Document* doc, Inkscape::XML::Node* repr, guint flags);
+ virtual Inkscape::XML::Node* write(Inkscape::XML::Document* doc, Inkscape::XML::Node* repr, unsigned int flags);
};
} // namespace Inkscape
diff --git a/src/color-rgba.h b/src/color-rgba.h
index ef7d9aee1..55cf68877 100644
--- a/src/color-rgba.h
+++ b/src/color-rgba.h
@@ -9,8 +9,9 @@
#ifndef SEEN_COLOR_RGBA_H
#define SEEN_COLOR_RGBA_H
-#include <glib.h> // g_assert()
+#include <cassert>
#include "decimal-round.h"
+typedef unsigned int guint32;
/**
* A class to contain a floating point RGBA color as one unit.
@@ -96,7 +97,7 @@ public:
* @return The requested value.
*/
float operator[](unsigned int const i) const {
- g_assert( unsigned(i) < 4 );
+ assert( unsigned(i) < 4 );
return _c[i];
}
diff --git a/src/color.cpp b/src/color.cpp
index dccd603b0..d7e8d25dd 100644
--- a/src/color.cpp
+++ b/src/color.cpp
@@ -12,13 +12,21 @@
* Released under GNU GPL, read the file 'COPYING' for more information
*/
-#include <math.h>
+#include <cmath>
+#include <cstdio>
+
+#define MIN(X,Y) ((X) < (Y) ? (X) : (Y))
+#define MAX(X,Y) ((X) > (Y) ? (X) : (Y))
+
#include "color.h"
#include "svg/svg-icc-color.h"
#include "svg/svg-color.h"
#include "svg/css-ostringstream.h"
+#define return_if_fail(x) if (!(x)) { printf("assertion failed: " #x); return; }
+#define return_val_if_fail(x, val) if (!(x)) { printf("assertion failed: " #x); return val; }
+
using Inkscape::CSSOStringStream;
using std::vector;
@@ -118,7 +126,7 @@ static bool profileMatches( SVGICCColor const* first, SVGICCColor const* second
&& (first->colorProfile == second->colorProfile)
&& (first->colors.size() == second->colors.size());
if ( match ) {
- for ( guint i = 0; i < first->colors.size(); i++ ) {
+ for ( unsigned i = 0; i < first->colors.size(); i++ ) {
match &= (fabs(first->colors[i] - second->colors[i]) < PROFILE_EPSILON);
}
}
@@ -132,12 +140,12 @@ static bool profileMatches( SVGICCColor const* first, SVGICCColor const* second
*/
void SPColor::set( float r, float g, float b )
{
- g_return_if_fail(r >= 0.0);
- g_return_if_fail(r <= 1.0);
- g_return_if_fail(g >= 0.0);
- g_return_if_fail(g <= 1.0);
- g_return_if_fail(b >= 0.0);
- g_return_if_fail(b <= 1.0);
+ return_if_fail(r >= 0.0);
+ return_if_fail(r <= 1.0);
+ return_if_fail(g >= 0.0);
+ return_if_fail(g <= 1.0);
+ return_if_fail(b >= 0.0);
+ return_if_fail(b <= 1.0);
// TODO clear icc if set?
v.c[0] = r;
@@ -160,9 +168,9 @@ void SPColor::set( guint32 value )
* Convert SPColor with integer alpha value to 32bit RGBA value.
* \pre alpha < 256
*/
-guint32 SPColor::toRGBA32( gint alpha ) const
+guint32 SPColor::toRGBA32( int alpha ) const
{
- g_return_val_if_fail (alpha <= 0xff, 0x0);
+ return_val_if_fail (alpha <= 0xff, 0x0);
guint32 rgba = SP_RGBA32_U_COMPOSE( SP_COLOR_F_TO_U(v.c[0]),
SP_COLOR_F_TO_U(v.c[1]),
@@ -175,12 +183,12 @@ guint32 SPColor::toRGBA32( gint alpha ) const
* Convert SPColor with float alpha value to 32bit RGBA value.
* \pre color != NULL && 0 <= alpha <= 1
*/
-guint32 SPColor::toRGBA32( gdouble alpha ) const
+guint32 SPColor::toRGBA32( double alpha ) const
{
- g_return_val_if_fail(alpha >= 0.0, 0x0);
- g_return_val_if_fail(alpha <= 1.0, 0x0);
+ return_val_if_fail(alpha >= 0.0, 0x0);
+ return_val_if_fail(alpha <= 1.0, 0x0);
- return toRGBA32( static_cast<gint>(SP_COLOR_F_TO_U(alpha)) );
+ return toRGBA32( static_cast<int>(SP_COLOR_F_TO_U(alpha)) );
}
std::string SPColor::toString() const
@@ -215,8 +223,8 @@ std::string SPColor::toString() const
void
sp_color_get_rgb_floatv(SPColor const *color, float *rgb)
{
- g_return_if_fail (color != NULL);
- g_return_if_fail (rgb != NULL);
+ return_if_fail (color != NULL);
+ return_if_fail (rgb != NULL);
rgb[0] = color->v.c[0];
rgb[1] = color->v.c[1];
@@ -230,8 +238,8 @@ sp_color_get_rgb_floatv(SPColor const *color, float *rgb)
void
sp_color_get_cmyk_floatv(SPColor const *color, float *cmyk)
{
- g_return_if_fail (color != NULL);
- g_return_if_fail (cmyk != NULL);
+ return_if_fail (color != NULL);
+ return_if_fail (cmyk != NULL);
sp_color_rgb_to_cmyk_floatv( cmyk,
color->v.c[0],
@@ -284,7 +292,7 @@ sp_color_rgb_to_hsv_floatv (float *hsv, float r, float g, float b)
void
sp_color_hsv_to_rgb_floatv (float *rgb, float h, float s, float v)
{
- gdouble f, w, q, t, d;
+ double f, w, q, t, d;
d = h * 5.99999999;
f = d - floor (d);
diff --git a/src/color.h b/src/color.h
index 604dff0e3..887daf66b 100644
--- a/src/color.h
+++ b/src/color.h
@@ -13,8 +13,8 @@
* Released under GNU GPL, read the file 'COPYING' for more information
*/
-#include <gdk/gdk.h>
#include <string>
+typedef unsigned int guint32; // uint is guaranteed to hold up to 2^32 − 1
/* Useful composition macros */
@@ -52,8 +52,8 @@ struct SPColor {
void set( float r, float g, float b );
void set( guint32 value );
- guint32 toRGBA32( gint alpha ) const;
- guint32 toRGBA32( gdouble alpha ) const;
+ guint32 toRGBA32( int alpha ) const;
+ guint32 toRGBA32( double alpha ) const;
std::string toString() const;
diff --git a/src/conn-avoid-ref.h b/src/conn-avoid-ref.h
index ce364abf1..e9e12118f 100644
--- a/src/conn-avoid-ref.h
+++ b/src/conn-avoid-ref.h
@@ -14,13 +14,13 @@
*/
#include <2geom/point.h>
-#include <glib.h>
#include <stddef.h>
#include <sigc++/connection.h>
class SPDesktop;
class SPObject;
class SPItem;
+typedef struct _GSList GSList;
namespace Avoid { class ShapeRef; }
class SPAvoidRef {
diff --git a/src/connection-pool.h b/src/connection-pool.h
deleted file mode 100644
index b1ac6f07a..000000000
--- a/src/connection-pool.h
+++ /dev/null
@@ -1,84 +0,0 @@
-#ifndef CONNECTION_POOL_H
-#define CONNECTION_POOL_H
-
-#include <map>
-#include <glib-object.h>
-#include <stddef.h>
-#include <string>
-#include <sigc++/sigc++.h>
-
-namespace Inkscape
-{
-class ConnectionPool
-{
- public:
-
- enum Exception
- {
- NAME_EXISTS,
- NAME_DOES_NOT_EXIST
- };
-
- typedef std::map<std::string, sigc::connection*> ConnectionMap;
-
- virtual ~ConnectionPool ()
- {
- for (ConnectionMap::iterator iter = map.begin (), end = map.end (); iter != end; ++iter) {
- sigc::connection* connection = (*iter).second;
- connection->disconnect ();
- delete connection;
- }
- }
-
- void
- add_connection (std::string name, sigc::connection* connection)
- {
- if (map.find (name) != map.end ()) throw NAME_EXISTS;
- map.insert (std::make_pair (name, connection));
- }
-
- void
- del_connection (std::string name)
- {
- ConnectionMap::iterator iter = map.find (name);
- if (iter == map.end ()) throw NAME_DOES_NOT_EXIST;
- sigc::connection* connection = (*iter).second;
- connection->disconnect ();
- delete connection;
- }
-
-
- static Inkscape::ConnectionPool*
- new_connection_pool (std::string name)
- {
- return new ConnectionPool (name);
- }
-
- static void
- del_connection_pool (Inkscape::ConnectionPool* pool)
- {
- delete pool;
- }
-
- static void
- connect_destroy (GObject *obj, Inkscape::ConnectionPool *pool)
- {
- g_object_connect (obj, "swapped-signal::destroy", G_CALLBACK (del_connection_pool), pool, NULL);
- }
-
- operator std::string ()
- {
- return name;
- }
-
- private:
-
- ConnectionPool (std::string name) : name (name)
- {}
-
- ConnectionMap map;
- std::string name;
-};
-}
-
-#endif
diff --git a/src/context-fns.cpp b/src/context-fns.cpp
index 1e30e51de..e1df53d98 100644
--- a/src/context-fns.cpp
+++ b/src/context-fns.cpp
@@ -1,17 +1,14 @@
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
#include <glibmm/i18n.h>
-#include "sp-item.h"
+
+#include "context-fns.h"
#include "desktop.h"
+#include "display/snap-indicator.h"
#include "message-context.h"
#include "message-stack.h"
-#include "context-fns.h"
#include "snap.h"
-#include "ui/tools/tool-base.h"
+#include "sp-item.h"
#include "sp-namedview.h"
-#include "display/snap-indicator.h"
+#include "ui/tools/tool-base.h"
static const double midpt_1_goldenratio = (1 + goldenratio) / 2;
static const double midpt_goldenratio_2 = (goldenratio + 2) / 2;
diff --git a/src/context-fns.h b/src/context-fns.h
index bd48e5fb8..82554a6c9 100644
--- a/src/context-fns.h
+++ b/src/context-fns.h
@@ -2,7 +2,6 @@
#define SEEN_CONTEXT_FNS_H
/*
- * <description>
*
* Authors:
*
@@ -11,11 +10,13 @@
* Released under GNU GPL, read the file 'COPYING' for more information
*/
-#include <gdk/gdk.h>
#include <2geom/forward.h>
-class SPDesktop;
-class SPItem;
+class SPDesktop;
+class SPItem;
+typedef union _GdkEvent GdkEvent;
+
+const double goldenratio = 1.61803398874989484820; // golden ratio
namespace Inkscape {
namespace UI {
@@ -25,12 +26,6 @@ class ToolBase;
}
}
-}
-
-const double goldenratio = 1.61803398874989484820; // golden ratio
-
-namespace Inkscape
-{
class MessageContext;
class MessageStack;
diff --git a/src/debug/gdk-event-latency-tracker.cpp b/src/debug/gdk-event-latency-tracker.cpp
index b21675f53..4679f05f1 100644
--- a/src/debug/gdk-event-latency-tracker.cpp
+++ b/src/debug/gdk-event-latency-tracker.cpp
@@ -9,6 +9,8 @@
* Released under GNU GPL, read the file 'COPYING' for more information
*/
+#include <gdk/gdk.h>
+
#include "debug/gdk-event-latency-tracker.h"
#include "preferences.h"
diff --git a/src/debug/gdk-event-latency-tracker.h b/src/debug/gdk-event-latency-tracker.h
index c3624e74f..0fdb18790 100644
--- a/src/debug/gdk-event-latency-tracker.h
+++ b/src/debug/gdk-event-latency-tracker.h
@@ -12,7 +12,7 @@
#ifndef SEEN_INKSCAPE_DEBUG_GDK_EVENT_LATENCY_TRACKER_H
#define SEEN_INKSCAPE_DEBUG_GDK_EVENT_LATENCY_TRACKER_H
-#include <gdk/gdk.h>
+typedef union _GdkEvent GdkEvent;
#include <glibmm/timer.h>
#include <boost/optional.hpp>
diff --git a/src/debug/log-display-config.cpp b/src/debug/log-display-config.cpp
index 07380b3ad..ecc05b7b7 100644
--- a/src/debug/log-display-config.cpp
+++ b/src/debug/log-display-config.cpp
@@ -10,6 +10,7 @@
*/
#include <iostream>
+#include <gtk/gtk.h>
#include <gdk/gdk.h>
#include "debug/event-tracker.h"
#include "debug/logger.h"
@@ -58,11 +59,16 @@ public:
Display() : ConfigurationEvent("display") {}
void generateChildEvents() const {
GdkDisplay *display=gdk_display_get_default();
+#if GTK_CHECK_VERSION(3,10,0)
+ GdkScreen *screen = gdk_display_get_screen(display, 0);
+ Logger::write<Screen>(screen);
+#else
gint n_screens = gdk_display_get_n_screens(display);
for ( gint i = 0 ; i < n_screens ; i++ ) {
GdkScreen *screen = gdk_display_get_screen(display, i);
Logger::write<Screen>(screen);
}
+#endif
}
};
diff --git a/src/desktop-events.cpp b/src/desktop-events.cpp
index 8be5e001b..5d8ea8b9f 100644
--- a/src/desktop-events.cpp
+++ b/src/desktop-events.cpp
@@ -25,7 +25,7 @@
#include "desktop.h"
#include "desktop-events.h"
#include "desktop-handles.h"
-#include "dialogs/dialog-events.h"
+#include "ui/dialog-events.h"
#include "display/canvas-axonomgrid.h"
#include "display/canvas-grid.h"
#include "display/guideline.h"
@@ -40,7 +40,7 @@
#include "display/sp-canvas.h"
#include "sp-guide.h"
#include "sp-namedview.h"
-#include "tools-switch.h"
+#include "ui/tools-switch.h"
#include "verbs.h"
#include "widgets/desktop-widget.h"
#include "xml/repr.h"
@@ -295,7 +295,7 @@ gint sp_dt_guide_event(SPCanvasItem *item, GdkEvent *event, gpointer data)
// here must be exactly on the guide line though, otherwise
// small errors will occur once we snap, see
// https://bugs.launchpad.net/inkscape/+bug/333762
- drag_origin = Geom::projection(event_dt, Geom::Line(guide->point_on_line, guide->angle()));
+ drag_origin = Geom::projection(event_dt, Geom::Line(guide->getPoint(), guide->angle()));
if (event->button.state & GDK_SHIFT_MASK) {
// with shift we rotate the guide
@@ -336,7 +336,7 @@ gint sp_dt_guide_event(SPCanvasItem *item, GdkEvent *event, gpointer data)
// be forced to be on the guide. If we don't snap however, then
// the origin should still be constrained to the guide. So let's do
// that explicitly first:
- Geom::Line line(guide->point_on_line, guide->angle());
+ Geom::Line line(guide->getPoint(), guide->angle());
Geom::Coord t = line.nearestPoint(motion_dt);
motion_dt = line.pointAt(t);
if (!(event->motion.state & GDK_SHIFT_MASK)) {
@@ -344,10 +344,15 @@ gint sp_dt_guide_event(SPCanvasItem *item, GdkEvent *event, gpointer data)
}
} else if (!((drag_type == SP_DRAG_ROTATE) && (event->motion.state & GDK_CONTROL_MASK))) {
// cannot use shift here to disable snapping, because we already use it for rotating the guide
+ Geom::Point temp;
if (drag_type == SP_DRAG_ROTATE) {
- m.guideFreeSnap(motion_dt, guide->point_on_line, true, false);
+ temp = guide->getPoint();
+ m.guideFreeSnap(motion_dt, temp, true, false);
+ guide->moveto(temp, false);
} else {
- m.guideFreeSnap(motion_dt, guide->normal_to_line, false, true);
+ temp = guide->getNormal();
+ m.guideFreeSnap(motion_dt, temp, false, true);
+ guide->set_normal(temp, false);
}
}
m.unSetup();
@@ -355,12 +360,12 @@ gint sp_dt_guide_event(SPCanvasItem *item, GdkEvent *event, gpointer data)
switch (drag_type) {
case SP_DRAG_TRANSLATE:
{
- sp_guide_moveto(*guide, motion_dt, false);
+ guide->moveto(motion_dt, false);
break;
}
case SP_DRAG_ROTATE:
{
- Geom::Point pt = motion_dt - guide->point_on_line;
+ Geom::Point pt = motion_dt - guide->getPoint();
Geom::Angle angle(pt);
if (event->motion.state & GDK_CONTROL_MASK) {
Inkscape::Preferences *prefs = Inkscape::Preferences::get();
@@ -368,7 +373,7 @@ gint sp_dt_guide_event(SPCanvasItem *item, GdkEvent *event, gpointer data)
bool const relative_snaps = prefs->getBool("/options/relativeguiderotationsnap/value", false);
if (snaps) {
if (relative_snaps) {
- Geom::Angle orig_angle(guide->normal_to_line);
+ Geom::Angle orig_angle(guide->getNormal());
Geom::Angle snap_angle = angle - orig_angle;
double sections = floor(snap_angle.radians0() * snaps / M_PI + .5);
angle = (M_PI / snaps) * sections + orig_angle.radians0();
@@ -378,16 +383,16 @@ gint sp_dt_guide_event(SPCanvasItem *item, GdkEvent *event, gpointer data)
}
}
}
- sp_guide_set_normal(*guide, Geom::Point::polar(angle).cw(), false);
+ guide->set_normal(Geom::Point::polar(angle).cw(), false);
break;
}
case SP_DRAG_MOVE_ORIGIN:
{
- sp_guide_moveto(*guide, motion_dt, false);
+ guide->moveto(motion_dt, false);
break;
}
case SP_DRAG_NONE:
- g_assert_not_reached();
+ assert(false);
break;
}
moved = true;
@@ -412,7 +417,7 @@ gint sp_dt_guide_event(SPCanvasItem *item, GdkEvent *event, gpointer data)
// be forced to be on the guide. If we don't snap however, then
// the origin should still be constrained to the guide. So let's
// do that explicitly first:
- Geom::Line line(guide->point_on_line, guide->angle());
+ Geom::Line line(guide->getPoint(), guide->angle());
Geom::Coord t = line.nearestPoint(event_dt);
event_dt = line.pointAt(t);
if (!(event->button.state & GDK_SHIFT_MASK)) {
@@ -420,10 +425,15 @@ gint sp_dt_guide_event(SPCanvasItem *item, GdkEvent *event, gpointer data)
}
} else if (!((drag_type == SP_DRAG_ROTATE) && (event->motion.state & GDK_CONTROL_MASK))) {
// cannot use shift here to disable snapping, because we already use it for rotating the guide
+ Geom::Point temp;
if (drag_type == SP_DRAG_ROTATE) {
- m.guideFreeSnap(event_dt, guide->point_on_line, true, false);
+ temp = guide->getPoint();
+ m.guideFreeSnap(event_dt, temp, true, false);
+ guide->moveto(temp, false);
} else {
- m.guideFreeSnap(event_dt, guide->normal_to_line, false, true);
+ temp = guide->getNormal();
+ m.guideFreeSnap(event_dt, temp, false, true);
+ guide->set_normal(temp, false);
}
}
m.unSetup();
@@ -432,12 +442,12 @@ gint sp_dt_guide_event(SPCanvasItem *item, GdkEvent *event, gpointer data)
switch (drag_type) {
case SP_DRAG_TRANSLATE:
{
- sp_guide_moveto(*guide, event_dt, true);
+ guide->moveto(event_dt, true);
break;
}
case SP_DRAG_ROTATE:
{
- Geom::Point pt = event_dt - guide->point_on_line;
+ Geom::Point pt = event_dt - guide->getPoint();
Geom::Angle angle(pt);
if (event->motion.state & GDK_CONTROL_MASK) {
Inkscape::Preferences *prefs = Inkscape::Preferences::get();
@@ -445,7 +455,7 @@ gint sp_dt_guide_event(SPCanvasItem *item, GdkEvent *event, gpointer data)
bool const relative_snaps = prefs->getBool("/options/relativeguiderotationsnap/value", false);
if (snaps) {
if (relative_snaps) {
- Geom::Angle orig_angle(guide->normal_to_line);
+ Geom::Angle orig_angle(guide->getNormal());
Geom::Angle snap_angle = angle - orig_angle;
double sections = floor(snap_angle.radians0() * snaps / M_PI + .5);
angle = (M_PI / snaps) * sections + orig_angle.radians0();
@@ -455,24 +465,24 @@ gint sp_dt_guide_event(SPCanvasItem *item, GdkEvent *event, gpointer data)
}
}
}
- sp_guide_set_normal(*guide, Geom::Point::polar(angle).cw(), true);
+ guide->set_normal(Geom::Point::polar(angle).cw(), true);
break;
}
case SP_DRAG_MOVE_ORIGIN:
{
- sp_guide_moveto(*guide, event_dt, true);
+ guide->moveto(event_dt, true);
break;
}
case SP_DRAG_NONE:
- g_assert_not_reached();
+ assert(false);
break;
}
DocumentUndo::done(sp_desktop_document(desktop), SP_VERB_NONE,
_("Move guide"));
} else {
/* Undo movement of any attached shapes. */
- sp_guide_moveto(*guide, guide->point_on_line, false);
- sp_guide_set_normal(*guide, guide->normal_to_line, false);
+ guide->moveto(guide->getPoint(), false);
+ guide->set_normal(guide->getNormal(), false);
sp_guide_remove(guide);
DocumentUndo::done(sp_desktop_document(desktop), SP_VERB_NONE,
_("Delete guide"));
@@ -487,7 +497,7 @@ gint sp_dt_guide_event(SPCanvasItem *item, GdkEvent *event, gpointer data)
break;
case GDK_ENTER_NOTIFY:
{
- sp_guideline_set_color(SP_GUIDELINE(item), guide->hicolor);
+ sp_guideline_set_color(SP_GUIDELINE(item), guide->getHiColor());
// set move or rotate cursor
Geom::Point const event_w(event->crossing.x, event->crossing.y);
@@ -512,13 +522,13 @@ gint sp_dt_guide_event(SPCanvasItem *item, GdkEvent *event, gpointer data)
#endif
}
- char *guide_description = sp_guide_description(guide);
+ char *guide_description = guide->description();
desktop->guidesMessageContext()->setF(Inkscape::NORMAL_MESSAGE, _("<b>Guideline</b>: %s"), guide_description);
g_free(guide_description);
break;
}
case GDK_LEAVE_NOTIFY:
- sp_guideline_set_color(SP_GUIDELINE(item), guide->color);
+ sp_guideline_set_color(SP_GUIDELINE(item), guide->getColor());
// restore event context's cursor
gdk_window_set_cursor(gtk_widget_get_window (GTK_WIDGET(sp_desktop_canvas(desktop))), desktop->event_context->cursor);
diff --git a/src/desktop-events.h b/src/desktop-events.h
index 7123ce91b..dc85e563b 100644
--- a/src/desktop-events.h
+++ b/src/desktop-events.h
@@ -13,13 +13,15 @@
* Released under GNU GPL, read the file 'COPYING' for more information
*/
-#include <gdk/gdk.h>
-#include <gtk/gtk.h>
-
class SPDesktop;
struct SPDesktopWidget;
struct SPCanvasItem;
+typedef union _GdkEvent GdkEvent;
+typedef struct _GdkEventCrossing GdkEventCrossing;
+typedef struct _GdkEventMotion GdkEventMotion;
+typedef struct _GtkWidget GtkWidget;
+
/* Item handlers */
int sp_desktop_root_handler (SPCanvasItem *item, GdkEvent *event, SPDesktop *desktop);
diff --git a/src/desktop-style.cpp b/src/desktop-style.cpp
index c2aa769f6..15dc339cf 100644
--- a/src/desktop-style.cpp
+++ b/src/desktop-style.cpp
@@ -14,6 +14,7 @@
#include <string>
#include <cstring>
+#include <glibmm.h>
#include "desktop.h"
#include "color-rgba.h"
diff --git a/src/desktop-style.h b/src/desktop-style.h
index fc20e97b9..40ca27e9e 100644
--- a/src/desktop-style.h
+++ b/src/desktop-style.h
@@ -13,13 +13,12 @@
* Released under GNU GPL, read the file 'COPYING' for more information
*/
-#include <glib.h>
-
class ColorRGBA;
class SPCSSAttr;
class SPDesktop;
class SPObject;
class SPStyle;
+typedef struct _GSList GSList;
namespace Inkscape {
namespace XML {
class Node;
diff --git a/src/desktop.cpp b/src/desktop.cpp
index f14a314b9..74dea3ca1 100644
--- a/src/desktop.cpp
+++ b/src/desktop.cpp
@@ -55,7 +55,7 @@
#include "document-undo.h"
#include "event-log.h"
#include "helper/action-context.h"
-#include "interface.h"
+#include "ui/interface.h"
#include "inkscape-private.h"
#include "layer-fns.h"
#include "layer-manager.h"
@@ -72,7 +72,7 @@
#include "sp-namedview.h"
#include "sp-root.h"
#include "sp-defs.h"
-#include "tool-factory.h"
+#include "ui/tool-factory.h"
#include "widgets/desktop-widget.h"
#include "xml/repr.h"
#include "helper/action.h" //sp_action_perform
diff --git a/src/desktop.h b/src/desktop.h
index ec240dd40..509f8a396 100644
--- a/src/desktop.h
+++ b/src/desktop.h
@@ -72,8 +72,9 @@ typedef struct _GdkEventAny GdkEventAny;
struct _GdkEventWindowState;
typedef struct _GdkEventWindowState GdkEventWindowState;
+struct InkscapeApplication;
+
namespace Inkscape {
- struct Application;
class LayerModel;
class MessageContext;
class Selection;
@@ -423,7 +424,7 @@ public:
private:
Inkscape::UI::View::EditWidgetInterface *_widget;
- Inkscape::Application *_inkscape;
+ InkscapeApplication *_inkscape;
Inkscape::MessageContext *_guides_message_context;
bool _active;
Geom::Affine _w2d;
diff --git a/src/dialogs/CMakeLists.txt b/src/dialogs/CMakeLists.txt
deleted file mode 100644
index ca19c0b72..000000000
--- a/src/dialogs/CMakeLists.txt
+++ /dev/null
@@ -1,11 +0,0 @@
-
-set(dialogs_SRC
- dialog-events.cpp
-
- # -------
- # Headers
- dialog-events.h
-)
-
-# add_inkscape_lib(dialogs_LIB "${dialogs_SRC}")
-add_inkscape_source("${dialogs_SRC}")
diff --git a/src/dialogs/Makefile_insert b/src/dialogs/Makefile_insert
deleted file mode 100644
index f1ed89314..000000000
--- a/src/dialogs/Makefile_insert
+++ /dev/null
@@ -1,5 +0,0 @@
-## Makefile.am fragment sourced by src/Makefile.am.
-
-ink_common_sources += \
- dialogs/dialog-events.cpp \
- dialogs/dialog-events.h
diff --git a/src/dialogs/makefile.in b/src/dialogs/makefile.in
deleted file mode 100644
index 9acaf79a0..000000000
--- a/src/dialogs/makefile.in
+++ /dev/null
@@ -1,17 +0,0 @@
-# Convenience stub makefile to call the real Makefile.
-
-@SET_MAKE@
-
-OBJEXT = @OBJEXT@
-
-# Explicit so that it's the default rule.
-all:
- cd .. && $(MAKE) dialogs/all
-
-clean %.a %.$(OBJEXT):
- cd .. && $(MAKE) dialogs/$@
-
-.PHONY: all clean
-
-.SUFFIXES:
-.SUFFIXES: .a .$(OBJEXT)
diff --git a/src/dir-util.h b/src/dir-util.h
index 17261af41..e78cad6a6 100644
--- a/src/dir-util.h
+++ b/src/dir-util.h
@@ -9,8 +9,8 @@
*
*/
-#include <stdlib.h>
-#include <glib.h>
+#include <cstdlib>
+#include <string>
/**
* Returns a form of \a path relative to \a base if that is easy to construct (eg if \a path
@@ -49,7 +49,7 @@ char *inkscape_rel2abs(char const *path, char const *base, char *result, size_t
char *inkscape_abs2rel(char const *path, char const *base, char *result, size_t const size);
-gchar *prepend_current_dir_if_relative(gchar const *filename);
+gchar *prepend_current_dir_if_relative(char const *filename);
#endif // !SEEN_DIR_UTIL_H
diff --git a/src/display/cairo-templates.h b/src/display/cairo-templates.h
index 57ec98f81..a49f925c3 100644
--- a/src/display/cairo-templates.h
+++ b/src/display/cairo-templates.h
@@ -16,6 +16,8 @@
#include "config.h"
#endif
+#include <glib.h>
+
#ifdef HAVE_OPENMP
#include <omp.h>
#include "preferences.h"
@@ -25,7 +27,6 @@ static const int OPENMP_THRESHOLD = 2048;
#include <algorithm>
#include <cairo.h>
-#include <glib.h>
#include <math.h>
#include "display/nr-3dutils.h"
#include "display/cairo-utils.h"
diff --git a/src/display/cairo-utils.cpp b/src/display/cairo-utils.cpp
index 5b358ade7..e1f12b04b 100644
--- a/src/display/cairo-utils.cpp
+++ b/src/display/cairo-utils.cpp
@@ -19,19 +19,20 @@
#include <glibmm/fileutils.h>
#include <2geom/pathvector.h>
#include <2geom/bezier-curve.h>
+#include <2geom/elliptical-arc.h>
#include <2geom/hvlinesegment.h>
#include <2geom/affine.h>
#include <2geom/point.h>
#include <2geom/path.h>
#include <2geom/transforms.h>
#include <2geom/sbasis-to-bezier.h>
+#include <gdk-pixbuf/gdk-pixbuf.h>
+
#include "color.h"
#include "style.h"
#include "helper/geom-curves.h"
#include "display/cairo-templates.h"
-static void ink_cairo_pixbuf_cleanup(guchar *, void *);
-
/**
* Key for cairo_surface_t to keep track of current color interpolation value
* Only the address of the structure is used, it is never initialized. See:
@@ -502,7 +503,17 @@ void Pixbuf::ensurePixelFormat(PixelFormat fmt)
static void
feed_curve_to_cairo(cairo_t *cr, Geom::Curve const &c, Geom::Affine const & trans, Geom::Rect view, bool optimize_stroke)
{
- if( is_straight_curve(c) )
+ using Geom::X;
+ using Geom::Y;
+
+ unsigned order = 0;
+ if (Geom::BezierCurve const* b = dynamic_cast<Geom::BezierCurve const*>(&c)) {
+ order = b->order();
+ }
+
+ // handle the three typical curve cases
+ switch (order) {
+ case 1:
{
Geom::Point end_tr = c.finalPoint() * trans;
if (!optimize_stroke) {
@@ -516,57 +527,97 @@ feed_curve_to_cairo(cairo_t *cr, Geom::Curve const &c, Geom::Affine const & tran
}
}
}
- else if(Geom::QuadraticBezier const *quadratic_bezier = dynamic_cast<Geom::QuadraticBezier const*>(&c)) {
+ break;
+ case 2:
+ {
+ Geom::QuadraticBezier const *quadratic_bezier = static_cast<Geom::QuadraticBezier const*>(&c);
std::vector<Geom::Point> points = quadratic_bezier->points();
points[0] *= trans;
points[1] *= trans;
points[2] *= trans;
+ // degree-elevate to cubic Bezier, since Cairo doesn't do quadratic Beziers
Geom::Point b1 = points[0] + (2./3) * (points[1] - points[0]);
Geom::Point b2 = b1 + (1./3) * (points[2] - points[0]);
if (!optimize_stroke) {
- cairo_curve_to(cr, b1[0], b1[1], b2[0], b2[1], points[2][0], points[2][1]);
+ cairo_curve_to(cr, b1[X], b1[Y], b2[X], b2[Y], points[2][X], points[2][Y]);
} else {
Geom::Rect swept(points[0], points[2]);
swept.expandTo(points[1]);
if (swept.intersects(view)) {
- cairo_curve_to(cr, b1[0], b1[1], b2[0], b2[1], points[2][0], points[2][1]);
+ cairo_curve_to(cr, b1[X], b1[Y], b2[X], b2[Y], points[2][X], points[2][Y]);
} else {
- cairo_move_to(cr, points[2][0], points[2][1]);
+ cairo_move_to(cr, points[2][X], points[2][Y]);
}
}
}
- else if(Geom::CubicBezier const *cubic_bezier = dynamic_cast<Geom::CubicBezier const*>(&c)) {
+ break;
+ case 3:
+ {
+ Geom::CubicBezier const *cubic_bezier = static_cast<Geom::CubicBezier const*>(&c);
std::vector<Geom::Point> points = cubic_bezier->points();
//points[0] *= trans; // don't do this one here for fun: it is only needed for optimized strokes
points[1] *= trans;
points[2] *= trans;
points[3] *= trans;
if (!optimize_stroke) {
- cairo_curve_to(cr, points[1][0], points[1][1], points[2][0], points[2][1], points[3][0], points[3][1]);
+ cairo_curve_to(cr, points[1][X], points[1][Y], points[2][X], points[2][Y], points[3][X], points[3][Y]);
} else {
points[0] *= trans; // didn't transform this point yet
Geom::Rect swept(points[0], points[3]);
swept.expandTo(points[1]);
swept.expandTo(points[2]);
if (swept.intersects(view)) {
- cairo_curve_to(cr, points[1][0], points[1][1], points[2][0], points[2][1], points[3][0], points[3][1]);
+ cairo_curve_to(cr, points[1][X], points[1][Y], points[2][X], points[2][Y], points[3][X], points[3][Y]);
} else {
- cairo_move_to(cr, points[3][0], points[3][1]);
+ cairo_move_to(cr, points[3][X], points[3][Y]);
}
}
}
-// else if(Geom::SVGEllipticalArc const *svg_elliptical_arc = dynamic_cast<Geom::SVGEllipticalArc *>(c)) {
-// //TODO: get at the innards and spit them out to cairo
-// }
- else {
- //this case handles sbasis as well as all other curve types
- Geom::Path sbasis_path = Geom::cubicbezierpath_from_sbasis(c.toSBasis(), 0.1);
-
- //recurse to convert the new path resulting from the sbasis to svgd
- for(Geom::Path::iterator iter = sbasis_path.begin(); iter != sbasis_path.end(); ++iter) {
- feed_curve_to_cairo(cr, *iter, trans, view, optimize_stroke);
+ break;
+ default:
+ {
+ if (Geom::EllipticalArc const *a = dynamic_cast<Geom::EllipticalArc const*>(&c)) {
+ //if (!optimize_stroke || a->boundsFast().intersects(view)) {
+ Geom::Affine xform = a->unitCircleTransform() * trans;
+ Geom::Point ang(a->initialAngle().radians(), a->finalAngle().radians());
+
+ // Apply the transformation to the current context
+ cairo_matrix_t cm;
+ cm.xx = xform[0];
+ cm.xy = xform[2];
+ cm.x0 = xform[4];
+ cm.yx = xform[1];
+ cm.yy = xform[3];
+ cm.y0 = xform[5];
+
+ cairo_save(cr);
+ cairo_transform(cr, &cm);
+
+ // Draw the circle
+ if (a->sweep()) {
+ cairo_arc(cr, 0, 0, 1, ang[0], ang[1]);
+ } else {
+ cairo_arc_negative(cr, 0, 0, 1, ang[0], ang[1]);
+ }
+ // Revert the current context
+ cairo_restore(cr);
+ //} else {
+ // Geom::Point f = a->finalPoint() * trans;
+ // cairo_move_to(cr, f[X], f[Y]);
+ //}
+ } else {
+ // handles sbasis as well as all other curve types
+ // this is very slow
+ Geom::Path sbasis_path = Geom::cubicbezierpath_from_sbasis(c.toSBasis(), 0.1);
+
+ // recurse to convert the new path resulting from the sbasis to svgd
+ for (Geom::Path::iterator iter = sbasis_path.begin(); iter != sbasis_path.end(); ++iter) {
+ feed_curve_to_cairo(cr, *iter, trans, view, optimize_stroke);
+ }
}
}
+ break;
+ }
}
@@ -579,7 +630,7 @@ feed_path_to_cairo (cairo_t *ct, Geom::Path const &path)
cairo_move_to(ct, path.initialPoint()[0], path.initialPoint()[1] );
- for(Geom::Path::const_iterator cit = path.begin(); cit != path.end_open(); ++cit) {
+ for (Geom::Path::const_iterator cit = path.begin(); cit != path.end_open(); ++cit) {
feed_curve_to_cairo(ct, *cit, Geom::identity(), Geom::Rect(), false); // optimize_stroke is false, so the view rect is not used
}
@@ -1119,7 +1170,7 @@ GdkPixbuf *ink_pixbuf_create_from_cairo_surface(cairo_surface_t *s)
* to gdk_pixbuf_new_from_data when creating a GdkPixbuf backed by
* a Cairo surface.
*/
-static void ink_cairo_pixbuf_cleanup(guchar * /*pixels*/, void *data)
+void ink_cairo_pixbuf_cleanup(guchar * /*pixels*/, void *data)
{
cairo_surface_t *surface = static_cast<cairo_surface_t*>(data);
cairo_surface_destroy(surface);
diff --git a/src/display/cairo-utils.h b/src/display/cairo-utils.h
index 505e2ca77..2a7e460e8 100644
--- a/src/display/cairo-utils.h
+++ b/src/display/cairo-utils.h
@@ -12,15 +12,16 @@
#ifndef SEEN_INKSCAPE_DISPLAY_CAIRO_UTILS_H
#define SEEN_INKSCAPE_DISPLAY_CAIRO_UTILS_H
+#include <2geom/forward.h>
#include <boost/noncopyable.hpp>
-//#include <glibmm/threads.h> // workaround
-#include <glib.h>
#include <cairomm/cairomm.h>
-//#include <gdkmm/pixbuf.h>
-#include <2geom/forward.h>
#include "style.h"
struct SPColor;
+typedef struct _GdkPixbuf GdkPixbuf;
+
+void ink_cairo_pixbuf_cleanup(unsigned char *, void *);
+void convert_pixbuf_argb32_to_normal(GdkPixbuf *pb);
namespace Inkscape {
diff --git a/src/display/canvas-arena.cpp b/src/display/canvas-arena.cpp
index 25d35fc6b..8738b93e4 100644
--- a/src/display/canvas-arena.cpp
+++ b/src/display/canvas-arena.cpp
@@ -11,7 +11,7 @@
* Released under GNU GPL, read the file 'COPYING' for more information
*/
-#include <gtk/gtk.h>
+#include <gtkmm.h>
#include "display/sp-canvas-util.h"
#include "helper/sp-marshal.h"
@@ -30,8 +30,6 @@ enum {
LAST_SIGNAL
};
-static void sp_canvas_arena_class_init(SPCanvasArenaClass *klass);
-static void sp_canvas_arena_init(SPCanvasArena *group);
static void sp_canvas_arena_destroy(SPCanvasItem *object);
static void sp_canvas_arena_item_deleted(SPCanvasArena *arena, Inkscape::DrawingItem *item);
@@ -46,7 +44,6 @@ static gint sp_canvas_arena_send_event (SPCanvasArena *arena, GdkEvent *event);
static void sp_canvas_arena_request_update (SPCanvasArena *ca, DrawingItem *item);
static void sp_canvas_arena_request_render (SPCanvasArena *ca, Geom::IntRect const &area);
-static SPCanvasItemClass *parent_class;
static guint signals[LAST_SIGNAL] = {0};
struct CachePrefObserver : public Inkscape::Preferences::Observer {
@@ -70,33 +67,13 @@ struct CachePrefObserver : public Inkscape::Preferences::Observer {
SPCanvasArena *_arena;
};
-GType
-sp_canvas_arena_get_type (void)
-{
- static GType type = 0;
- if (!type) {
- GTypeInfo info = {
- sizeof (SPCanvasArenaClass),
- NULL, NULL,
- (GClassInitFunc) sp_canvas_arena_class_init,
- NULL, NULL,
- sizeof (SPCanvasArena),
- 0,
- (GInstanceInitFunc) sp_canvas_arena_init,
- NULL
- };
- type = g_type_register_static (SP_TYPE_CANVAS_ITEM, "SPCanvasArena", &info, (GTypeFlags)0);
- }
- return type;
-}
+G_DEFINE_TYPE(SPCanvasArena, sp_canvas_arena, SP_TYPE_CANVAS_ITEM);
static void
sp_canvas_arena_class_init (SPCanvasArenaClass *klass)
{
SPCanvasItemClass *item_class = (SPCanvasItemClass *) klass;
- parent_class = (SPCanvasItemClass*)g_type_class_peek_parent (klass);
-
signals[ARENA_EVENT] = g_signal_new ("arena_event",
G_TYPE_FROM_CLASS(item_class),
G_SIGNAL_RUN_LAST,
@@ -149,8 +126,8 @@ static void sp_canvas_arena_destroy(SPCanvasItem *object)
delete arena->observer;
arena->drawing.~Drawing();
- if (SP_CANVAS_ITEM_CLASS(parent_class)->destroy)
- (* SP_CANVAS_ITEM_CLASS(parent_class)->destroy) (object);
+ if (SP_CANVAS_ITEM_CLASS(sp_canvas_arena_parent_class)->destroy)
+ SP_CANVAS_ITEM_CLASS(sp_canvas_arena_parent_class)->destroy(object);
}
static void
@@ -158,8 +135,8 @@ sp_canvas_arena_update (SPCanvasItem *item, Geom::Affine const &affine, unsigned
{
SPCanvasArena *arena = SP_CANVAS_ARENA (item);
- if (((SPCanvasItemClass *) parent_class)->update)
- (* ((SPCanvasItemClass *) parent_class)->update) (item, affine, flags);
+ if (SP_CANVAS_ITEM_CLASS(sp_canvas_arena_parent_class)->update)
+ SP_CANVAS_ITEM_CLASS(sp_canvas_arena_parent_class)->update(item, affine, flags);
arena->ctx.ctm = affine;
diff --git a/src/display/canvas-arena.h b/src/display/canvas-arena.h
index 26f19732d..15bbc2ee0 100644
--- a/src/display/canvas-arena.h
+++ b/src/display/canvas-arena.h
@@ -13,15 +13,13 @@
* Released under GNU GPL, read the file 'COPYING' for more information
*/
-#include <cairo.h>
#include <2geom/rect.h>
+
#include "display/drawing.h"
#include "display/drawing-item.h"
#include "display/sp-canvas.h"
#include "display/sp-canvas-item.h"
-G_BEGIN_DECLS
-
#define SP_TYPE_CANVAS_ARENA (sp_canvas_arena_get_type ())
#define SP_CANVAS_ARENA(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), SP_TYPE_CANVAS_ARENA, SPCanvasArena))
#define SP_CANVAS_ARENA_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), SP_TYPE_CANVAS_ARENA, SPCanvasArenaClass))
@@ -30,6 +28,7 @@ G_BEGIN_DECLS
typedef struct _SPCanvasArena SPCanvasArena;
typedef struct _SPCanvasArenaClass SPCanvasArenaClass;
+typedef struct _cairo_surface cairo_surface_t;
struct CachePrefObserver;
namespace Inkscape {
@@ -39,7 +38,6 @@ class DrawingItem;
} // namespace Inkscape
-
struct _SPCanvasArena {
SPCanvasItem item;
@@ -70,6 +68,4 @@ void sp_canvas_arena_set_sticky (SPCanvasArena *ca, gboolean sticky);
void sp_canvas_arena_render_surface (SPCanvasArena *ca, cairo_surface_t *surface, Geom::IntRect const &area);
-G_END_DECLS
-
#endif // SEEN_SP_CANVAS_ARENA_H
diff --git a/src/display/canvas-axonomgrid.h b/src/display/canvas-axonomgrid.h
index 3888a3dc4..92cdb4c50 100644
--- a/src/display/canvas-axonomgrid.h
+++ b/src/display/canvas-axonomgrid.h
@@ -26,11 +26,11 @@ public:
CanvasAxonomGrid(SPNamedView * nv, Inkscape::XML::Node * in_repr, SPDocument * in_doc);
virtual ~CanvasAxonomGrid();
- void Update (Geom::Affine const &affine, unsigned int flags);
- void Render (SPCanvasBuf *buf);
+ virtual void Update (Geom::Affine const &affine, unsigned int flags);
+ virtual void Render (SPCanvasBuf *buf);
- void readRepr();
- void onReprAttrChanged (Inkscape::XML::Node * repr, const gchar *key, const gchar *oldval, const gchar *newval, bool is_interactive);
+ virtual void readRepr();
+ virtual void onReprAttrChanged (Inkscape::XML::Node * repr, char const *key, char const *oldval, char const *newval, bool is_interactive);
double lengthy; /**< The lengths of the primary y-axis */
double angle_deg[3]; /**< Angle of each axis (note that angle[2] == 0) */
diff --git a/src/display/canvas-bpath.cpp b/src/display/canvas-bpath.cpp
index ee9e14f10..46b59d25a 100644
--- a/src/display/canvas-bpath.cpp
+++ b/src/display/canvas-bpath.cpp
@@ -11,9 +11,6 @@
*
*/
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif
#include <sstream>
#include <string.h>
#include "desktop.h"
@@ -27,42 +24,18 @@
#include "helper/geom.h"
#include "display/sp-canvas.h"
-static void sp_canvas_bpath_class_init (SPCanvasBPathClass *klass);
-static void sp_canvas_bpath_init (SPCanvasBPath *path);
static void sp_canvas_bpath_destroy(SPCanvasItem *object);
static void sp_canvas_bpath_update (SPCanvasItem *item, Geom::Affine const &affine, unsigned int flags);
static void sp_canvas_bpath_render (SPCanvasItem *item, SPCanvasBuf *buf);
static double sp_canvas_bpath_point (SPCanvasItem *item, Geom::Point p, SPCanvasItem **actual_item);
-static SPCanvasItemClass *parent_class;
-
-GType
-sp_canvas_bpath_get_type (void)
-{
- static GType type = 0;
- if (!type) {
- GTypeInfo info = {
- sizeof (SPCanvasBPathClass),
- NULL, NULL,
- (GClassInitFunc) sp_canvas_bpath_class_init,
- NULL, NULL,
- sizeof (SPCanvasBPath),
- 0,
- (GInstanceInitFunc) sp_canvas_bpath_init,
- NULL
- };
- type = g_type_register_static (SP_TYPE_CANVAS_ITEM, "SPCanvasBPath", &info, (GTypeFlags)0);
- }
- return type;
-}
+G_DEFINE_TYPE(SPCanvasBPath, sp_canvas_bpath, SP_TYPE_CANVAS_ITEM);
static void sp_canvas_bpath_class_init(SPCanvasBPathClass *klass)
{
SPCanvasItemClass *item_class = (SPCanvasItemClass *) klass;
- parent_class = (SPCanvasItemClass*)g_type_class_peek_parent (klass);
-
item_class->destroy = sp_canvas_bpath_destroy;
item_class->update = sp_canvas_bpath_update;
item_class->render = sp_canvas_bpath_render;
@@ -90,8 +63,8 @@ static void sp_canvas_bpath_destroy(SPCanvasItem *object)
cbp->curve = cbp->curve->unref();
}
- if (SP_CANVAS_ITEM_CLASS(parent_class)->destroy)
- (* SP_CANVAS_ITEM_CLASS(parent_class)->destroy) (object);
+ if (SP_CANVAS_ITEM_CLASS(sp_canvas_bpath_parent_class)->destroy)
+ (* SP_CANVAS_ITEM_CLASS(sp_canvas_bpath_parent_class)->destroy) (object);
}
static void sp_canvas_bpath_update(SPCanvasItem *item, Geom::Affine const &affine, unsigned int flags)
@@ -100,8 +73,8 @@ static void sp_canvas_bpath_update(SPCanvasItem *item, Geom::Affine const &affin
item->canvas->requestRedraw((int)item->x1, (int)item->y1, (int)item->x2, (int)item->y2);
- if (reinterpret_cast<SPCanvasItemClass *>(parent_class)->update) {
- reinterpret_cast<SPCanvasItemClass *>(parent_class)->update(item, affine, flags);
+ if (reinterpret_cast<SPCanvasItemClass *>(sp_canvas_bpath_parent_class)->update) {
+ reinterpret_cast<SPCanvasItemClass *>(sp_canvas_bpath_parent_class)->update(item, affine, flags);
}
sp_canvas_item_reset_bounds (item);
diff --git a/src/display/canvas-grid.cpp b/src/display/canvas-grid.cpp
index 4b1dbd1ed..2eeaa7006 100644
--- a/src/display/canvas-grid.cpp
+++ b/src/display/canvas-grid.cpp
@@ -71,42 +71,16 @@ static gchar const *const grid_svgname[] = {
// ##########################################################
// Grid CanvasItem
-static void grid_canvasitem_class_init (GridCanvasItemClass *klass);
-static void grid_canvasitem_init (GridCanvasItem *grid);
static void grid_canvasitem_destroy(SPCanvasItem *object);
static void grid_canvasitem_update (SPCanvasItem *item, Geom::Affine const &affine, unsigned int flags);
static void grid_canvasitem_render (SPCanvasItem *item, SPCanvasBuf *buf);
-static SPCanvasItemClass * parent_class;
-
-GType
-grid_canvasitem_get_type (void)
-{
- static GType grid_canvasitem_type = 0;
-
- if (!grid_canvasitem_type) {
- GTypeInfo grid_canvasitem_info = {
- sizeof (GridCanvasItemClass),
- NULL, NULL,
- (GClassInitFunc) grid_canvasitem_class_init,
- NULL, NULL,
- sizeof (GridCanvasItem),
- 0,
- (GInstanceInitFunc) grid_canvasitem_init,
- NULL
- };
-
- grid_canvasitem_type = g_type_register_static(SPCanvasItem::getType(), "GridCanvasItem", &grid_canvasitem_info, GTypeFlags(0));
- }
- return grid_canvasitem_type;
-}
+G_DEFINE_TYPE(GridCanvasItem, grid_canvasitem, SP_TYPE_CANVAS_ITEM);
static void grid_canvasitem_class_init(GridCanvasItemClass *klass)
{
SPCanvasItemClass *item_class = (SPCanvasItemClass *) klass;
- parent_class = (SPCanvasItemClass*)g_type_class_peek_parent (klass);
-
item_class->destroy = grid_canvasitem_destroy;
item_class->update = grid_canvasitem_update;
item_class->render = grid_canvasitem_render;
@@ -123,8 +97,8 @@ static void grid_canvasitem_destroy(SPCanvasItem *object)
g_return_if_fail (object != NULL);
g_return_if_fail (INKSCAPE_IS_GRID_CANVASITEM (object));
- if (SP_CANVAS_ITEM_CLASS(parent_class)->destroy)
- (* SP_CANVAS_ITEM_CLASS(parent_class)->destroy) (object);
+ if (SP_CANVAS_ITEM_CLASS(grid_canvasitem_parent_class)->destroy)
+ (* SP_CANVAS_ITEM_CLASS(grid_canvasitem_parent_class)->destroy) (object);
}
/**
@@ -145,8 +119,8 @@ grid_canvasitem_update (SPCanvasItem *item, Geom::Affine const &affine, unsigned
{
GridCanvasItem *gridcanvasitem = INKSCAPE_GRID_CANVASITEM (item);
- if (parent_class->update)
- (* parent_class->update) (item, affine, flags);
+ if (SP_CANVAS_ITEM_CLASS(grid_canvasitem_parent_class)->update)
+ SP_CANVAS_ITEM_CLASS(grid_canvasitem_parent_class)->update(item, affine, flags);
if (gridcanvasitem->grid) {
gridcanvasitem->grid->Update(affine, flags);
diff --git a/src/display/canvas-grid.h b/src/display/canvas-grid.h
index 5a23dee52..557bd6dab 100644
--- a/src/display/canvas-grid.h
+++ b/src/display/canvas-grid.h
@@ -82,7 +82,7 @@ public:
virtual void Render (SPCanvasBuf *buf) = 0;
virtual void readRepr() = 0;
- virtual void onReprAttrChanged (Inkscape::XML::Node * /*repr*/, const gchar */*key*/, const gchar */*oldval*/, const gchar */*newval*/, bool /*is_interactive*/) = 0;
+ virtual void onReprAttrChanged (Inkscape::XML::Node * /*repr*/, char const */*key*/, char const */*oldval*/, char const */*newval*/, bool /*is_interactive*/) = 0;
Gtk::Widget * newWidget();
@@ -129,11 +129,11 @@ public:
CanvasXYGrid(SPNamedView * nv, Inkscape::XML::Node * in_repr, SPDocument * in_doc);
virtual ~CanvasXYGrid();
- void Update (Geom::Affine const &affine, unsigned int flags);
- void Render (SPCanvasBuf *buf);
+ virtual void Update (Geom::Affine const &affine, unsigned int flags);
+ virtual void Render (SPCanvasBuf *buf);
- void readRepr();
- void onReprAttrChanged (Inkscape::XML::Node * repr, const gchar *key, const gchar *oldval, const gchar *newval, bool is_interactive);
+ virtual void readRepr();
+ virtual void onReprAttrChanged (Inkscape::XML::Node * repr, char const *key, char const *oldval, char const *newval, bool is_interactive);
Geom::Point spacing; /**< Spacing between elements of the grid */
bool scaled[2]; /**< Whether the grid is in scaled mode, which can
diff --git a/src/display/canvas-temporary-item-list.cpp b/src/display/canvas-temporary-item-list.cpp
index b0fec98b5..60ead11ce 100644
--- a/src/display/canvas-temporary-item-list.cpp
+++ b/src/display/canvas-temporary-item-list.cpp
@@ -10,9 +10,8 @@
* Released under GNU GPL, read the file 'COPYING' for more information
*/
-#include "display/canvas-temporary-item-list.h"
-
#include "display/canvas-temporary-item.h"
+#include "display/canvas-temporary-item-list.h"
namespace Inkscape {
namespace Display {
@@ -35,7 +34,7 @@ TemporaryItemList::~TemporaryItemList()
/* Note that TemporaryItem or TemporaryItemList is responsible for deletion and such, so this return pointer can safely be ignored. */
TemporaryItem *
-TemporaryItemList::add_item(SPCanvasItem *item, guint lifetime)
+TemporaryItemList::add_item(SPCanvasItem *item, unsigned int lifetime)
{
// beware of strange things happening due to very short timeouts
TemporaryItem * tempitem = new TemporaryItem(item, lifetime);
diff --git a/src/display/canvas-temporary-item-list.h b/src/display/canvas-temporary-item-list.h
index d204c692f..471bb99b9 100644
--- a/src/display/canvas-temporary-item-list.h
+++ b/src/display/canvas-temporary-item-list.h
@@ -11,7 +11,6 @@
*/
#include <list>
-#include <glib.h>
struct SPCanvasItem;
class SPDesktop;
@@ -22,14 +21,14 @@ namespace Display {
class TemporaryItem;
/**
- * Provides a class that can contain active TemporaryItem's on a desktop.
+ * Provides a class that can contain active TemporaryItem[s] on a desktop.
*/
class TemporaryItemList {
public:
TemporaryItemList(SPDesktop *desktop);
virtual ~TemporaryItemList();
- TemporaryItem* add_item (SPCanvasItem *item, guint lifetime);
+ TemporaryItem* add_item (SPCanvasItem *item, unsigned int lifetime);
void delete_item (TemporaryItem * tempitem);
protected:
diff --git a/src/display/canvas-temporary-item.cpp b/src/display/canvas-temporary-item.cpp
index 551ea1536..f55c8bf4e 100644
--- a/src/display/canvas-temporary-item.cpp
+++ b/src/display/canvas-temporary-item.cpp
@@ -16,7 +16,7 @@
#include "display/canvas-temporary-item.h"
-#include <gtk/gtk.h>
+#include <glib.h>
#include "display/sp-canvas-item.h"
namespace Inkscape {
@@ -54,9 +54,9 @@ TemporaryItem::~TemporaryItem()
}
}
-/* static method*/
-gboolean TemporaryItem::_timeout(gpointer data) {
- TemporaryItem *tempitem = reinterpret_cast<TemporaryItem *>(data);
+/* static method */
+int TemporaryItem::_timeout(void* data) {
+ TemporaryItem *tempitem = static_cast<TemporaryItem *>(data);
tempitem->timeout_id = 0;
tempitem->signal_timeout.emit(tempitem);
delete tempitem;
diff --git a/src/display/canvas-temporary-item.h b/src/display/canvas-temporary-item.h
index 09d243fa1..39ca2fc65 100644
--- a/src/display/canvas-temporary-item.h
+++ b/src/display/canvas-temporary-item.h
@@ -11,9 +11,8 @@
*/
-#include <stddef.h>
-#include <sigc++/sigc++.h>
-#include <glib.h>
+#include <cstddef>
+#include <sigc++/signal.h>
struct SPCanvasItem;
@@ -25,7 +24,7 @@ namespace Display {
*/
class TemporaryItem {
public:
- TemporaryItem(SPCanvasItem *item, guint lifetime, bool destroy_on_deselect = false);
+ TemporaryItem(SPCanvasItem *item, unsigned int lifetime, bool destroy_on_deselect = false);
virtual ~TemporaryItem();
sigc::signal<void, TemporaryItem *> signal_timeout;
@@ -34,10 +33,10 @@ protected:
friend class TemporaryItemList;
SPCanvasItem * canvasitem; /** The item we are holding on to */
- guint timeout_id; /** ID by which glib knows the timeout event */
+ unsigned int timeout_id; /** ID by which glib knows the timeout event */
bool destroy_on_deselect; // only destroy when parent item is deselected, not when mouse leaves
- static gboolean _timeout(gpointer data); ///< callback for when lifetime expired
+ static int _timeout(void* data); ///< callback for when lifetime expired
private:
TemporaryItem(const TemporaryItem&);
diff --git a/src/display/canvas-text.cpp b/src/display/canvas-text.cpp
index fe60d9c65..5ad87b4ef 100644
--- a/src/display/canvas-text.cpp
+++ b/src/display/canvas-text.cpp
@@ -12,10 +12,6 @@
* Released under GNU GPL, read the file 'COPYING' for more information
*/
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif
-
#include <sstream>
#include <string.h>
@@ -26,42 +22,17 @@
#include "color.h"
#include "display/sp-canvas.h"
-static void sp_canvastext_class_init (SPCanvasTextClass *klass);
-static void sp_canvastext_init (SPCanvasText *canvastext);
static void sp_canvastext_destroy(SPCanvasItem *object);
static void sp_canvastext_update (SPCanvasItem *item, Geom::Affine const &affine, unsigned int flags);
static void sp_canvastext_render (SPCanvasItem *item, SPCanvasBuf *buf);
-static SPCanvasItemClass *parent_class_ct;
-
-GType
-sp_canvastext_get_type (void)
-{
- static GType type = 0;
-
- if (!type) {
- GTypeInfo info = {
- sizeof (SPCanvasTextClass),
- NULL, NULL,
- (GClassInitFunc) sp_canvastext_class_init,
- NULL, NULL,
- sizeof (SPCanvasText),
- 0,
- (GInstanceInitFunc) sp_canvastext_init,
- NULL
- };
- type = g_type_register_static (SP_TYPE_CANVAS_ITEM, "SPCanvasText", &info, (GTypeFlags)0);
- }
- return type;
-}
+G_DEFINE_TYPE(SPCanvasText, sp_canvastext, SP_TYPE_CANVAS_ITEM);
static void sp_canvastext_class_init(SPCanvasTextClass *klass)
{
SPCanvasItemClass *item_class = SP_CANVAS_ITEM_CLASS(klass);
- parent_class_ct = SP_CANVAS_ITEM_CLASS(g_type_class_peek_parent(klass));
-
item_class->destroy = sp_canvastext_destroy;
item_class->update = sp_canvastext_update;
item_class->render = sp_canvastext_render;
@@ -101,8 +72,8 @@ static void sp_canvastext_destroy(SPCanvasItem *object)
canvastext->text = NULL;
canvastext->item = NULL;
- if (SP_CANVAS_ITEM_CLASS(parent_class_ct)->destroy)
- (* SP_CANVAS_ITEM_CLASS(parent_class_ct)->destroy) (object);
+ if (SP_CANVAS_ITEM_CLASS(sp_canvastext_parent_class)->destroy)
+ SP_CANVAS_ITEM_CLASS(sp_canvastext_parent_class)->destroy(object);
}
static void
@@ -151,8 +122,8 @@ sp_canvastext_update (SPCanvasItem *item, Geom::Affine const &affine, unsigned i
item->canvas->requestRedraw((int)item->x1, (int)item->y1, (int)item->x2, (int)item->y2);
- if (parent_class_ct->update)
- (* parent_class_ct->update) (item, affine, flags);
+ if (SP_CANVAS_ITEM_CLASS(sp_canvastext_parent_class)->update)
+ SP_CANVAS_ITEM_CLASS(sp_canvastext_parent_class)->update(item, affine, flags);
sp_canvas_item_reset_bounds (item);
diff --git a/src/display/curve.cpp b/src/display/curve.cpp
index 50f4c8954..54a62939d 100644
--- a/src/display/curve.cpp
+++ b/src/display/curve.cpp
@@ -1,10 +1,4 @@
-#define __CURVE_C__
-
-/** \file
- * Routines for SPCurve and for its Geom::PathVector
- */
-
-/*
+/**
* Authors:
* Lauris Kaplinski <lauris@kaplinski.com>
* Johan Engelen
@@ -14,7 +8,7 @@
* Copyright (C) 2002 Lauris Kaplinski
* Copyright (C) 2008 Johan Engelen
*
- * Released under GNU GPL
+ * Released under GNU GPL, see file 'COPYING' for more information
*/
#include "display/curve.h"
@@ -25,6 +19,10 @@
#include <2geom/sbasis-to-bezier.h>
#include <2geom/point.h>
+/**
+ * Routines for SPCurve and for its Geom::PathVector
+ */
+
/* Constructors */
/**
@@ -50,7 +48,7 @@ SPCurve::new_from_rect(Geom::Rect const &rect, bool all_four_sides)
Geom::Point p = rect.corner(0);
c->moveto(p);
- for (int i=3; i>=1; i--) {
+ for (int i=3; i>=1; --i) {
c->lineto(rect.corner(i));
}
@@ -89,10 +87,10 @@ SPCurve::get_pathvector() const
* Returns the number of segments of all paths summed
* This count includes the closing line segment of a closed path.
*/
-guint
+size_t
SPCurve::get_segment_count() const
{
- guint nr = 0;
+ size_t nr = 0;
for(Geom::PathVector::const_iterator it = _pathv.begin(); it != _pathv.end(); ++it) {
nr += (*it).size();
@@ -202,7 +200,7 @@ SPCurve::reset()
* Calls SPCurve::moveto() with point made of given coordinates.
*/
void
-SPCurve::moveto(gdouble x, gdouble y)
+SPCurve::moveto(double x, double y)
{
moveto(Geom::Point(x, y));
}
@@ -231,7 +229,7 @@ SPCurve::lineto(Geom::Point const &p)
* Calls SPCurve::lineto( Geom::Point(x,y) )
*/
void
-SPCurve::lineto(gdouble x, gdouble y)
+SPCurve::lineto(double x, double y)
{
lineto(Geom::Point(x,y));
}
@@ -251,7 +249,7 @@ SPCurve::quadto(Geom::Point const &p1, Geom::Point const &p2)
* All coordinates must be finite.
*/
void
-SPCurve::quadto(gdouble x1, gdouble y1, gdouble x2, gdouble y2)
+SPCurve::quadto(double x1, double y1, double x2, double y2)
{
quadto( Geom::Point(x1,y1), Geom::Point(x2,y2) );
}
@@ -271,7 +269,7 @@ SPCurve::curveto(Geom::Point const &p0, Geom::Point const &p1, Geom::Point const
* All coordinates must be finite.
*/
void
-SPCurve::curveto(gdouble x0, gdouble y0, gdouble x1, gdouble y1, gdouble x2, gdouble y2)
+SPCurve::curveto(double x0, double y0, double x1, double y1, double x2, double y2)
{
curveto( Geom::Point(x0,y0), Geom::Point(x1,y1), Geom::Point(x2,y2) );
}
@@ -522,7 +520,7 @@ SPCurve::append(SPCurve const *curve2,
* When one of the curves is empty, this curves path becomes the non-empty path.
*/
SPCurve *
-SPCurve::append_continuous(SPCurve const *c1, gdouble tolerance)
+SPCurve::append_continuous(SPCurve const *c1, double tolerance)
{
using Geom::X;
using Geom::Y;
@@ -632,10 +630,10 @@ SPCurve::move_endpoints(Geom::Point const &new_p0, Geom::Point const &new_p1)
* Sum of nodes in all the paths. When a path is closed, and its closing line segment is of zero-length,
* this function will not count the closing knot double (so basically ignores the closing line segment when it has zero length)
*/
-guint
+size_t
SPCurve::nodes_in_path() const
{
- guint nr = 0;
+ size_t nr = 0;
for(Geom::PathVector::const_iterator it = _pathv.begin(); it != _pathv.end(); ++it) {
nr += (*it).size();
@@ -686,4 +684,4 @@ SPCurve::last_point_additive_move(Geom::Point const & p)
fill-column:99
End:
*/
-// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:
diff --git a/src/display/curve.h b/src/display/curve.h
index 4866655c4..5fad75b18 100644
--- a/src/display/curve.h
+++ b/src/display/curve.h
@@ -1,8 +1,5 @@
-#ifndef SEEN_DISPLAY_CURVE_H
-#define SEEN_DISPLAY_CURVE_H
-
-/*
- * Author:
+/**
+ * Authors:
* Lauris Kaplinski <lauris@kaplinski.com>
*
* Copyright (C) 2000 Lauris Kaplinski
@@ -10,17 +7,20 @@
* Copyright (C) 2002 Lauris Kaplinski
* Copyright (C) 2008 Johan Engelen
*
- * Released under GNU GPL
+ * Released under GNU GPL, see file 'COPYING' for more information
*/
-#include <glib.h>
+#ifndef SEEN_DISPLAY_CURVE_H
+#define SEEN_DISPLAY_CURVE_H
#include <2geom/forward.h>
-
+#include <cstddef>
#include <boost/optional.hpp>
+extern "C" { typedef struct _GSList GSList; }
+
/**
- * Wrapper around a Geom::PathVector objects.
+ * Wrapper around a Geom::PathVector object.
*/
class SPCurve {
public:
@@ -39,8 +39,8 @@ public:
SPCurve * copy() const;
- guint get_segment_count() const;
- guint nodes_in_path() const;
+ size_t get_segment_count() const;
+ size_t nodes_in_path() const;
bool is_empty() const;
bool is_closed() const;
@@ -56,13 +56,13 @@ public:
void reset();
void moveto(Geom::Point const &p);
- void moveto(gdouble x, gdouble y);
+ void moveto(double x, double y);
void lineto(Geom::Point const &p);
- void lineto(gdouble x, gdouble y);
+ void lineto(double x, double y);
void quadto(Geom::Point const &p1, Geom::Point const &p2);
- void quadto(gdouble x1, gdouble y1, gdouble x2, gdouble y2);
+ void quadto(double x1, double y1, double x2, double y2);
void curveto(Geom::Point const &p0, Geom::Point const &p1, Geom::Point const &p2);
- void curveto(gdouble x0, gdouble y0, gdouble x1, gdouble y1, gdouble x2, gdouble y2);
+ void curveto(double x0, double y0, double x1, double y1, double x2, double y2);
void closepath();
void closepath_current();
void backspace();
@@ -73,14 +73,14 @@ public:
void last_point_additive_move(Geom::Point const & p);
void append(SPCurve const *curve2, bool use_lineto);
- SPCurve * append_continuous(SPCurve const *c1, gdouble tolerance);
+ SPCurve * append_continuous(SPCurve const *c1, double tolerance);
SPCurve * create_reverse() const;
GSList * split() const;
static SPCurve * concat(GSList const *list);
protected:
- gint _refcount;
+ size_t _refcount;
Geom::PathVector _pathv;
@@ -90,7 +90,7 @@ private:
SPCurve& operator=(const SPCurve&);
};
-#endif /* !SEEN_DISPLAY_CURVE_H */
+#endif // !SEEN_DISPLAY_CURVE_H
/*
Local Variables:
@@ -101,4 +101,4 @@ private:
fill-column:99
End:
*/
-// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8 :
diff --git a/src/display/drawing-context.h b/src/display/drawing-context.h
index 0d82087c3..a15e0d0e5 100644
--- a/src/display/drawing-context.h
+++ b/src/display/drawing-context.h
@@ -12,13 +12,13 @@
#ifndef SEEN_INKSCAPE_DISPLAY_DRAWING_CONTEXT_H
#define SEEN_INKSCAPE_DISPLAY_DRAWING_CONTEXT_H
-#include <boost/utility.hpp>
-#include <glib.h>
-#include <cairo.h>
#include <2geom/affine.h>
#include <2geom/angle.h>
#include <2geom/rect.h>
#include <2geom/transforms.h>
+#include <boost/utility.hpp>
+#include <cairo.h>
+typedef unsigned int guint32;
namespace Inkscape {
diff --git a/src/display/drawing-group.cpp b/src/display/drawing-group.cpp
index 38ace001f..bce89d70e 100644
--- a/src/display/drawing-group.cpp
+++ b/src/display/drawing-group.cpp
@@ -9,13 +9,14 @@
* Released under GNU GPL, read the file 'COPYING' for more information
*/
-#include "display/cairo-utils.h"
#include "display/drawing.h"
#include "display/drawing-context.h"
#include "display/drawing-item.h"
#include "display/drawing-group.h"
#include "style.h"
+#include "display/cairo-utils.h"
+
namespace Inkscape {
DrawingGroup::DrawingGroup(Drawing &drawing)
diff --git a/src/display/drawing-image.cpp b/src/display/drawing-image.cpp
index 00caef525..e56f3e58b 100644
--- a/src/display/drawing-image.cpp
+++ b/src/display/drawing-image.cpp
@@ -10,13 +10,15 @@
*/
#include <2geom/bezier-curve.h>
-#include "display/cairo-utils.h"
+
#include "display/drawing.h"
#include "display/drawing-context.h"
#include "display/drawing-image.h"
#include "preferences.h"
#include "style.h"
+#include "display/cairo-utils.h"
+
namespace Inkscape {
DrawingImage::DrawingImage(Drawing &drawing)
diff --git a/src/display/drawing-item.cpp b/src/display/drawing-item.cpp
index 5226edda3..9bb81cea5 100644
--- a/src/display/drawing-item.cpp
+++ b/src/display/drawing-item.cpp
@@ -10,8 +10,7 @@
*/
#include <climits>
-#include "display/cairo-utils.h"
-#include "display/cairo-templates.h"
+
#include "display/drawing.h"
#include "display/drawing-context.h"
#include "display/drawing-item.h"
@@ -22,6 +21,9 @@
#include "preferences.h"
#include "style.h"
+#include "display/cairo-utils.h"
+#include "display/cairo-templates.h"
+
namespace Inkscape {
void set_cairo_blend_operator( DrawingContext &dc, unsigned blend_mode ) {
@@ -868,9 +870,10 @@ DrawingItem::pick(Geom::Point const &p, double delta, unsigned flags)
{
// Sometimes there's no BBOX in state, reason unknown (bug 992817)
// I made this not an assert to remove the warning
+ // This warning clutters the console output, so commented out
if (!(_state & STATE_BBOX) || !(_state & STATE_PICK)) {
- g_warning("Invalid state when picking: STATE_BBOX = %d, STATE_PICK = %d",
- _state & STATE_BBOX, _state & STATE_PICK);
+ /*g_warning("Invalid state when picking: STATE_BBOX = %d, STATE_PICK = %d",
+ _state & STATE_BBOX, _state & STATE_PICK);*/
return NULL;
}
// ignore invisible and insensitive items unless sticky
diff --git a/src/display/drawing-item.h b/src/display/drawing-item.h
index c0c6e321e..9b399e6e3 100644
--- a/src/display/drawing-item.h
+++ b/src/display/drawing-item.h
@@ -12,13 +12,13 @@
#ifndef SEEN_INKSCAPE_DISPLAY_DRAWING_ITEM_H
#define SEEN_INKSCAPE_DISPLAY_DRAWING_ITEM_H
-#include <list>
-#include <exception>
+#include <2geom/rect.h>
+#include <2geom/affine.h>
#include <boost/operators.hpp>
#include <boost/utility.hpp>
#include <boost/intrusive/list.hpp>
-#include <2geom/rect.h>
-#include <2geom/affine.h>
+#include <exception>
+#include <list>
class SPStyle;
diff --git a/src/display/drawing-shape.cpp b/src/display/drawing-shape.cpp
index fe525b1a5..66160638f 100644
--- a/src/display/drawing-shape.cpp
+++ b/src/display/drawing-shape.cpp
@@ -9,7 +9,7 @@
* Released under GNU GPL, read the file 'COPYING' for more information
*/
-#include <glib.h>
+#include <glibmm.h>
#include <2geom/curves.h>
#include <2geom/pathvector.h>
#include <2geom/path-sink.h>
diff --git a/src/display/drawing-surface.h b/src/display/drawing-surface.h
index e937cca55..7bec1606a 100644
--- a/src/display/drawing-surface.h
+++ b/src/display/drawing-surface.h
@@ -14,11 +14,16 @@
#include <boost/shared_ptr.hpp>
#include <cairo.h>
-#include <gdk-pixbuf/gdk-pixbuf.h>
#include <2geom/affine.h>
#include <2geom/rect.h>
#include <2geom/transforms.h>
+extern "C" {
+typedef struct _cairo cairo_t;
+typedef struct _cairo_surface cairo_surface_t;
+typedef struct _cairo_region cairo_region_t;
+}
+
namespace Inkscape {
class DrawingContext;
diff --git a/src/display/drawing-text.cpp b/src/display/drawing-text.cpp
index cb6520bcd..afe661b2e 100644
--- a/src/display/drawing-text.cpp
+++ b/src/display/drawing-text.cpp
@@ -9,8 +9,8 @@
* Released under GNU GPL, read the file 'COPYING' for more information
*/
-#include "display/cairo-utils.h"
-#include "display/canvas-bpath.h" // for SPWindRule (WTF!)
+//#include "display/cairo-utils.h"
+//#include "display/canvas-bpath.h" // for SPWindRule (WTF!)
#include "display/drawing.h"
#include "display/drawing-context.h"
#include "display/drawing-surface.h"
@@ -20,6 +20,9 @@
#include "style.h"
#include "2geom/pathvector.h"
+#include "display/cairo-utils.h"
+#include "display/canvas-bpath.h"
+
namespace Inkscape {
diff --git a/src/display/drawing.h b/src/display/drawing.h
index cc74833ba..0c12b1510 100644
--- a/src/display/drawing.h
+++ b/src/display/drawing.h
@@ -12,18 +12,18 @@
#ifndef SEEN_INKSCAPE_DISPLAY_DRAWING_H
#define SEEN_INKSCAPE_DISPLAY_DRAWING_H
-#include <set>
-#include <glib.h>
+#include <2geom/rect.h>
#include <boost/operators.hpp>
#include <boost/utility.hpp>
+#include <set>
#include <sigc++/sigc++.h>
-#include <2geom/rect.h>
+
#include "display/drawing-item.h"
#include "display/rendermode.h"
#include "nr-filter-colormatrix.h"
typedef struct _SPCanvasArena SPCanvasArena;
-
+typedef unsigned int guint32;
namespace Inkscape {
@@ -65,7 +65,7 @@ public:
OutlineColors const &colors() const { return _colors; }
- void setGrayscaleMatrix(gdouble value_matrix[20]);
+ void setGrayscaleMatrix(double value_matrix[20]);
void update(Geom::IntRect const &area = Geom::IntRect::infinite(), UpdateContext const &ctx = UpdateContext(), unsigned flags = DrawingItem::STATE_ALL, unsigned reset = 0);
void render(DrawingContext &dc, Geom::IntRect const &area, unsigned flags = 0);
@@ -100,7 +100,7 @@ private:
OutlineColors _colors;
Filters::FilterColorMatrix::ColorMatrixMatrix _grayscale_colormatrix;
- SPCanvasArena *_canvasarena; // may be NULL is this arena is not the screen
+ SPCanvasArena *_canvasarena; // may be NULL if this arena is not the screen
// but used for export etc.
friend class DrawingItem;
diff --git a/src/display/gnome-canvas-acetate.cpp b/src/display/gnome-canvas-acetate.cpp
index 2cd0f296d..9147a1bbf 100644
--- a/src/display/gnome-canvas-acetate.cpp
+++ b/src/display/gnome-canvas-acetate.cpp
@@ -15,40 +15,17 @@
#include "gnome-canvas-acetate.h"
-static void sp_canvas_acetate_class_init (SPCanvasAcetateClass *klass);
-static void sp_canvas_acetate_init (SPCanvasAcetate *acetate);
static void sp_canvas_acetate_destroy(SPCanvasItem *object);
static void sp_canvas_acetate_update (SPCanvasItem *item, Geom::Affine const &affine, unsigned int flags);
static double sp_canvas_acetate_point (SPCanvasItem *item, Geom::Point p, SPCanvasItem **actual_item);
-static SPCanvasItemClass *parent_class;
-
-GType sp_canvas_acetate_get_type (void)
-{
- static GType acetate_type = 0;
- if (!acetate_type) {
- GTypeInfo acetate_info = {
- sizeof (SPCanvasAcetateClass),
- NULL, NULL,
- (GClassInitFunc) sp_canvas_acetate_class_init,
- NULL, NULL,
- sizeof (SPCanvasAcetate),
- 0,
- (GInstanceInitFunc) sp_canvas_acetate_init,
- NULL
- };
- acetate_type = g_type_register_static(SPCanvasItem::getType(), "SPCanvasAcetate", &acetate_info, GTypeFlags(0));
- }
- return acetate_type;
-}
+G_DEFINE_TYPE(SPCanvasAcetate, sp_canvas_acetate, SP_TYPE_CANVAS_ITEM);
static void sp_canvas_acetate_class_init (SPCanvasAcetateClass *klass)
{
SPCanvasItemClass *item_class = (SPCanvasItemClass *) klass;
- parent_class = (SPCanvasItemClass*)g_type_class_peek_parent (klass);
-
item_class->destroy = sp_canvas_acetate_destroy;
item_class->update = sp_canvas_acetate_update;
item_class->point = sp_canvas_acetate_point;
@@ -64,8 +41,8 @@ static void sp_canvas_acetate_destroy(SPCanvasItem *object)
g_return_if_fail (object != NULL);
g_return_if_fail (GNOME_IS_CANVAS_ACETATE (object));
- if (SP_CANVAS_ITEM_CLASS(parent_class)->destroy)
- (* SP_CANVAS_ITEM_CLASS(parent_class)->destroy) (object);
+ if (SP_CANVAS_ITEM_CLASS(sp_canvas_acetate_parent_class)->destroy)
+ SP_CANVAS_ITEM_CLASS(sp_canvas_acetate_parent_class)->destroy(object);
}
static void sp_canvas_acetate_update( SPCanvasItem *item, Geom::Affine const &/*affine*/, unsigned int /*flags*/ )
diff --git a/src/display/gnome-canvas-acetate.h b/src/display/gnome-canvas-acetate.h
index 447c3a9c4..3e1ba7661 100644
--- a/src/display/gnome-canvas-acetate.h
+++ b/src/display/gnome-canvas-acetate.h
@@ -15,10 +15,8 @@
* Released under GNU GPL, read the file 'COPYING' for more information
*/
-#include <glib.h>
#include "display/sp-canvas-item.h"
-
#define GNOME_TYPE_CANVAS_ACETATE (sp_canvas_acetate_get_type ())
#define SP_CANVAS_ACETATE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GNOME_TYPE_CANVAS_ACETATE, SPCanvasAcetate))
#define SP_CANVAS_ACETATE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GNOME_TYPE_CANVAS_ACETATE, SPCanvasAcetateClass))
@@ -27,17 +25,15 @@
struct SPCanvasAcetate {
- SPCanvasItem item;
+ SPCanvasItem item;
};
struct SPCanvasAcetateClass {
- SPCanvasItemClass parent_class;
+ SPCanvasItemClass parent_class;
};
GType sp_canvas_acetate_get_type (void);
-
-
#endif // SEEN_SP_CANVAS_ACETATE_H
/*
diff --git a/src/display/grayscale.cpp b/src/display/grayscale.cpp
index f59cf6d23..3c0031e87 100644
--- a/src/display/grayscale.cpp
+++ b/src/display/grayscale.cpp
@@ -36,7 +36,7 @@ guint32 process(guint32 rgba) {
return process(SP_RGBA32_R_U(rgba), SP_RGBA32_G_U(rgba), SP_RGBA32_B_U(rgba), SP_RGBA32_A_U(rgba));
}
-guint32 process(guchar r, guchar g, guchar b, guchar a) {
+guint32 process(unsigned char r, unsigned char g, unsigned char b, unsigned char a) {
/** To reduce banding in gradients, this calculation is tweaked a bit
* by outputing blue+1 or red+1 or both. The luminance is calculated
@@ -62,7 +62,7 @@ guint32 process(guchar r, guchar g, guchar b, guchar a) {
}
}
-guchar luminance(guchar r, guchar g, guchar b) {
+unsigned char luminance(unsigned char r, unsigned char g, unsigned char b) {
guint32 luminance = ( red_factor * r
+ green_factor * g
+ blue_factor * b );
diff --git a/src/display/grayscale.h b/src/display/grayscale.h
index 18162e1f3..0ffe727da 100644
--- a/src/display/grayscale.h
+++ b/src/display/grayscale.h
@@ -10,15 +10,15 @@
* Released under GNU GPL
*/
-#include <gdk/gdk.h>
+typedef unsigned int guint32;
/**
* Provide methods to calculate grayscale values (e.g. convert rgba value to grayscale rgba value).
*/
namespace Grayscale {
guint32 process(guint32 rgba);
- guint32 process(guchar r, guchar g, guchar b, guchar a);
- guchar luminance(guchar r, guchar g, guchar b);
+ guint32 process(unsigned char r, unsigned char g, unsigned char b, unsigned char a);
+ unsigned char luminance(unsigned char r, unsigned char g, unsigned char b);
bool activeDesktopIsGrayscale();
};
diff --git a/src/display/guideline.cpp b/src/display/guideline.cpp
index 55c1ee495..44bbd14bd 100644
--- a/src/display/guideline.cpp
+++ b/src/display/guideline.cpp
@@ -29,8 +29,6 @@
using Inkscape::ControlManager;
-static void sp_guideline_class_init(SPGuideLineClass *c);
-static void sp_guideline_init(SPGuideLine *guideline);
static void sp_guideline_destroy(SPCanvasItem *object);
static void sp_guideline_update(SPCanvasItem *item, Geom::Affine const &affine, unsigned int flags);
@@ -40,34 +38,10 @@ static double sp_guideline_point(SPCanvasItem *item, Geom::Point p, SPCanvasItem
static void sp_guideline_drawline (SPCanvasBuf *buf, gint x0, gint y0, gint x1, gint y1, guint32 rgba);
-static SPCanvasItemClass *parent_class;
-
-GType sp_guideline_get_type()
-{
- static GType guideline_type = 0;
-
- if (!guideline_type) {
- static GTypeInfo const guideline_info = {
- sizeof (SPGuideLineClass),
- NULL, NULL,
- (GClassInitFunc) sp_guideline_class_init,
- NULL, NULL,
- sizeof (SPGuideLine),
- 16,
- (GInstanceInitFunc) sp_guideline_init,
- NULL,
- };
-
- guideline_type = g_type_register_static(SP_TYPE_CANVAS_ITEM, "SPGuideLine", &guideline_info, (GTypeFlags) 0);
- }
-
- return guideline_type;
-}
+G_DEFINE_TYPE(SPGuideLine, sp_guideline, SP_TYPE_CANVAS_ITEM);
static void sp_guideline_class_init(SPGuideLineClass *c)
{
- parent_class = SP_CANVAS_ITEM_CLASS(g_type_class_peek_parent(c));
-
SPCanvasItemClass *item_class = SP_CANVAS_ITEM_CLASS(c);
item_class->destroy = sp_guideline_destroy;
item_class->update = sp_guideline_update;
@@ -108,7 +82,7 @@ static void sp_guideline_destroy(SPCanvasItem *object)
g_free(gl->label);
}
- SP_CANVAS_ITEM_CLASS(parent_class)->destroy(object);
+ SP_CANVAS_ITEM_CLASS(sp_guideline_parent_class)->destroy(object);
}
static void sp_guideline_render(SPCanvasItem *item, SPCanvasBuf *buf)
@@ -197,8 +171,8 @@ static void sp_guideline_update(SPCanvasItem *item, Geom::Affine const &affine,
{
SPGuideLine *gl = SP_GUIDELINE(item);
- if ((SP_CANVAS_ITEM_CLASS(parent_class))->update) {
- (SP_CANVAS_ITEM_CLASS(parent_class))->update(item, affine, flags);
+ if ((SP_CANVAS_ITEM_CLASS(sp_guideline_parent_class))->update) {
+ (SP_CANVAS_ITEM_CLASS(sp_guideline_parent_class))->update(item, affine, flags);
}
gl->affine = affine;
diff --git a/src/display/nr-3dutils.h b/src/display/nr-3dutils.h
index c278c81c6..eb773a9ad 100644
--- a/src/display/nr-3dutils.h
+++ b/src/display/nr-3dutils.h
@@ -1,5 +1,5 @@
-#ifndef __NR_3DUTILS_H__
-#define __NR_3DUTILS_H__
+#ifndef SEEN_NR_3DUTILS_H
+#define SEEN_NR_3DUTILS_H
/*
* 3D utils. Definition of gdouble vectors of dimension 3 and of some basic
@@ -14,7 +14,6 @@
* Released under GNU GPL, read the file 'COPYING' for more information
*/
-#include <gdk/gdk.h>
#include <2geom/forward.h>
namespace NR {
@@ -51,7 +50,7 @@ const static Fvector EYE_VECTOR(0, 0, 1);
* \param v a reference to a vector with double components
* \return the euclidian norm of v
*/
-gdouble norm(const Fvector &v);
+double norm(const Fvector &v);
/**
* Normalizes a vector
@@ -67,7 +66,7 @@ void normalize_vector(Fvector &v);
* \param b a Fvector reference
* \return the scalar product of a and b
*/
-gdouble scalar_product(const Fvector &a, const Fvector &b);
+double scalar_product(const Fvector &a, const Fvector &b);
/**
* Computes the normalized sum of two Fvectors
@@ -88,7 +87,7 @@ void normalized_sum(Fvector &r, const Fvector &a, const Fvector &b);
* \param z a reference to a z coordinate
* \param z a reference to a transformation matrix
*/
-void convert_coord(gdouble &x, gdouble &y, gdouble &z, Geom::Affine const &trans);
+void convert_coord(double &x, double &y, double &z, Geom::Affine const &trans);
} /* namespace NR */
diff --git a/src/display/nr-filter-blend.cpp b/src/display/nr-filter-blend.cpp
index 25aea6f13..d0db6b42e 100644
--- a/src/display/nr-filter-blend.cpp
+++ b/src/display/nr-filter-blend.cpp
@@ -20,6 +20,7 @@
#include "config.h"
#endif
+#include <glibmm.h>
#include "display/cairo-templates.h"
#include "display/cairo-utils.h"
#include "display/nr-filter-blend.h"
diff --git a/src/display/nr-filter-blend.h b/src/display/nr-filter-blend.h
index c0504993b..30c9d6725 100644
--- a/src/display/nr-filter-blend.h
+++ b/src/display/nr-filter-blend.h
@@ -1,5 +1,5 @@
-#ifndef __NR_FILTER_BLEND_H__
-#define __NR_FILTER_BLEND_H__
+#ifndef SEEN_NR_FILTER_BLEND_H
+#define SEEN_NR_FILTER_BLEND_H
/*
* SVG feBlend renderer
diff --git a/src/display/nr-filter-colormatrix.h b/src/display/nr-filter-colormatrix.h
index c7e5e91d9..cc43f4914 100644
--- a/src/display/nr-filter-colormatrix.h
+++ b/src/display/nr-filter-colormatrix.h
@@ -1,5 +1,5 @@
-#ifndef __NR_FILTER_COLOR_MATRIX_H__
-#define __NR_FILTER_COLOR_MATRIX_H__
+#ifndef SEEN_NR_FILTER_COLOR_MATRIX_H
+#define SEEN_NR_FILTER_COLOR_MATRIX_H
/*
* feColorMatrix filter primitive renderer
@@ -16,6 +16,9 @@
#include <2geom/forward.h>
#include "display/nr-filter-primitive.h"
+typedef unsigned int guint32;
+typedef signed int gint32;
+
namespace Inkscape {
namespace Filters {
@@ -40,8 +43,8 @@ public:
virtual double complexity(Geom::Affine const &ctm);
virtual void set_type(FilterColorMatrixType type);
- virtual void set_value(gdouble value);
- virtual void set_values(std::vector<gdouble> const &values);
+ virtual void set_value(double value);
+ virtual void set_values(std::vector<double> const &values);
public:
struct ColorMatrixMatrix {
@@ -52,8 +55,8 @@ public:
};
private:
- std::vector<gdouble> values;
- gdouble value;
+ std::vector<double> values;
+ double value;
FilterColorMatrixType type;
};
diff --git a/src/display/nr-filter-component-transfer.h b/src/display/nr-filter-component-transfer.h
index 558d097a8..7019dde37 100644
--- a/src/display/nr-filter-component-transfer.h
+++ b/src/display/nr-filter-component-transfer.h
@@ -1,5 +1,5 @@
-#ifndef __NR_FILTER_COMPONENT_TRANSFER_H__
-#define __NR_FILTER_COMPONENT_TRANSFER_H__
+#ifndef SEEN_NR_FILTER_COMPONENT_TRANSFER_H
+#define SEEN_NR_FILTER_COMPONENT_TRANSFER_H
/*
* feComponentTransfer filter primitive renderer
@@ -40,7 +40,7 @@ public:
virtual double complexity(Geom::Affine const &ctm);
FilterComponentTransferType type[4];
- std::vector<gdouble> tableValues[4];
+ std::vector<double> tableValues[4];
double slope[4];
double intercept[4];
double amplitude[4];
diff --git a/src/display/nr-filter-composite.h b/src/display/nr-filter-composite.h
index 95579cc0e..35756383b 100644
--- a/src/display/nr-filter-composite.h
+++ b/src/display/nr-filter-composite.h
@@ -1,5 +1,5 @@
-#ifndef __NR_FILTER_COMPOSITE_H__
-#define __NR_FILTER_COMPOSITE_H__
+#ifndef SEEN_NR_FILTER_COMPOSITE_H
+#define SEEN_NR_FILTER_COMPOSITE_H
/*
* feComposite filter effect renderer
diff --git a/src/display/nr-filter-convolve-matrix.h b/src/display/nr-filter-convolve-matrix.h
index 4041ff96f..d2e38eb95 100644
--- a/src/display/nr-filter-convolve-matrix.h
+++ b/src/display/nr-filter-convolve-matrix.h
@@ -1,5 +1,5 @@
-#ifndef __NR_FILTER_CONVOLVE_MATRIX_H__
-#define __NR_FILTER_CONVOLVE_MATRIX_H__
+#ifndef SEEN_NR_FILTER_CONVOLVE_MATRIX_H
+#define SEEN_NR_FILTER_CONVOLVE_MATRIX_H
/*
* feConvolveMatrix filter primitive renderer
@@ -48,10 +48,10 @@ public:
void set_preserveAlpha(bool pa);
private:
- std::vector<gdouble> kernelMatrix;
+ std::vector<double> kernelMatrix;
int targetX, targetY;
int orderX, orderY;
- gdouble divisor, bias;
+ double divisor, bias;
int dx, dy, kernelUnitLength;
FilterConvolveMatrixEdgeMode edgeMode;
bool preserveAlpha;
diff --git a/src/display/nr-filter-diffuselighting.h b/src/display/nr-filter-diffuselighting.h
index 043a5eb39..7739b3ea6 100644
--- a/src/display/nr-filter-diffuselighting.h
+++ b/src/display/nr-filter-diffuselighting.h
@@ -1,5 +1,5 @@
-#ifndef __NR_FILTER_DIFFUSELIGHTING_H__
-#define __NR_FILTER_DIFFUSELIGHTING_H__
+#ifndef SEEN_NR_FILTER_DIFFUSELIGHTING_H
+#define SEEN_NR_FILTER_DIFFUSELIGHTING_H
/*
* feDiffuseLighting renderer
@@ -13,7 +13,6 @@
* Released under GNU GPL, read the file 'COPYING' for more information
*/
-#include <gdk/gdk.h>
#include "display/nr-light-types.h"
#include "display/nr-filter-primitive.h"
#include "display/nr-filter-slot.h"
@@ -23,6 +22,7 @@ class SPFeDistantLight;
class SPFePointLight;
class SPFeSpotLight;
struct SVGICCColor;
+typedef unsigned int guint32;
namespace Inkscape {
namespace Filters {
@@ -43,8 +43,8 @@ public:
SPFeSpotLight *spot;
} light;
LightType light_type;
- gdouble diffuseConstant;
- gdouble surfaceScale;
+ double diffuseConstant;
+ double surfaceScale;
guint32 lighting_color;
private:
diff --git a/src/display/nr-filter-displacement-map.h b/src/display/nr-filter-displacement-map.h
index a01930045..c4e2400fe 100644
--- a/src/display/nr-filter-displacement-map.h
+++ b/src/display/nr-filter-displacement-map.h
@@ -1,5 +1,5 @@
-#ifndef __NR_FILTER_DISPLACEMENT_MAP_H__
-#define __NR_FILTER_DISPLACEMENT_MAP_H__
+#ifndef SEEN_NR_FILTER_DISPLACEMENT_MAP_H
+#define SEEN_NR_FILTER_DISPLACEMENT_MAP_H
/*
* feDisplacementMap filter primitive renderer
diff --git a/src/display/nr-filter-flood.h b/src/display/nr-filter-flood.h
index 9a968047d..826aa981a 100644
--- a/src/display/nr-filter-flood.h
+++ b/src/display/nr-filter-flood.h
@@ -1,5 +1,5 @@
-#ifndef __NR_FILTER_FLOOD_H__
-#define __NR_FILTER_FLOOD_H__
+#ifndef SEEN_NR_FILTER_FLOOD_H
+#define SEEN_NR_FILTER_FLOOD_H
/*
* feFlood filter primitive renderer
@@ -15,6 +15,7 @@
#include "display/nr-filter-primitive.h"
struct SVGICCColor;
+typedef unsigned int guint32;
namespace Inkscape {
namespace Filters {
diff --git a/src/display/nr-filter-gaussian.h b/src/display/nr-filter-gaussian.h
index 1c35a0f1d..88c38247f 100644
--- a/src/display/nr-filter-gaussian.h
+++ b/src/display/nr-filter-gaussian.h
@@ -1,5 +1,5 @@
-#ifndef __NR_FILTER_GAUSSIAN_H__
-#define __NR_FILTER_GAUSSIAN_H__
+#ifndef SEEN_NR_FILTER_GAUSSIAN_H
+#define SEEN_NR_FILTER_GAUSSIAN_H
/*
* Gaussian blur renderer
diff --git a/src/display/nr-filter-image.h b/src/display/nr-filter-image.h
index 69691ac99..147a8ba6c 100644
--- a/src/display/nr-filter-image.h
+++ b/src/display/nr-filter-image.h
@@ -1,5 +1,5 @@
-#ifndef __NR_FILTER_IMAGE_H__
-#define __NR_FILTER_IMAGE_H__
+#ifndef SEEN_NR_FILTER_IMAGE_H
+#define SEEN_NR_FILTER_IMAGE_H
/*
* feImage filter primitive renderer
@@ -34,7 +34,7 @@ public:
virtual double complexity(Geom::Affine const &ctm);
void set_document( SPDocument *document );
- void set_href(const gchar *href);
+ void set_href(char const *href);
void set_align( unsigned int align );
void set_clip( unsigned int clip );
bool from_element;
@@ -42,7 +42,7 @@ public:
private:
SPDocument *document;
- gchar *feImageHref;
+ char *feImageHref;
Inkscape::Pixbuf *image;
float feImageX, feImageY, feImageWidth, feImageHeight;
unsigned int aspect_align, aspect_clip;
diff --git a/src/display/nr-filter-merge.h b/src/display/nr-filter-merge.h
index 238f9a3e7..b20d663ab 100644
--- a/src/display/nr-filter-merge.h
+++ b/src/display/nr-filter-merge.h
@@ -1,5 +1,5 @@
-#ifndef __NR_FILTER_MERGE_H__
-#define __NR_FILTER_MERGE_H__
+#ifndef SEEN_NR_FILTER_MERGE_H
+#define SEEN_NR_FILTER_MERGE_H
/*
* feMerge filter effect renderer
diff --git a/src/display/nr-filter-morphology.h b/src/display/nr-filter-morphology.h
index 0574ff4ad..cd7dfe775 100644
--- a/src/display/nr-filter-morphology.h
+++ b/src/display/nr-filter-morphology.h
@@ -1,5 +1,5 @@
-#ifndef __NR_FILTER_MORPHOLOGY_H__
-#define __NR_FILTER_MORPHOLOGY_H__
+#ifndef SEEN_NR_FILTER_MORPHOLOGY_H
+#define SEEN_NR_FILTER_MORPHOLOGY_H
/*
* feMorphology filter primitive renderer
diff --git a/src/display/nr-filter-offset.h b/src/display/nr-filter-offset.h
index 1ecc1621e..c1ee1d82a 100644
--- a/src/display/nr-filter-offset.h
+++ b/src/display/nr-filter-offset.h
@@ -1,5 +1,5 @@
-#ifndef __NR_FILTER_OFFSET_H__
-#define __NR_FILTER_OFFSET_H__
+#ifndef SEEN_NR_FILTER_OFFSET_H
+#define SEEN_NR_FILTER_OFFSET_H
/*
* feOffset filter primitive renderer
diff --git a/src/display/nr-filter-primitive.h b/src/display/nr-filter-primitive.h
index 214b2cfc5..4b7577159 100644
--- a/src/display/nr-filter-primitive.h
+++ b/src/display/nr-filter-primitive.h
@@ -13,6 +13,7 @@
#include <2geom/forward.h>
#include <2geom/rect.h>
+
#include "display/nr-filter-types.h"
#include "svg/svg-length.h"
@@ -30,7 +31,7 @@ public:
virtual ~FilterPrimitive();
virtual void render_cairo(FilterSlot &slot);
- virtual int render(FilterSlot & /*slot*/, FilterUnits const & /*units*/) { return 0; }
+ virtual int render(FilterSlot & /*slot*/, FilterUnits const & /*units*/) { return 0; } // pure virtual?
virtual void area_enlarge(Geom::IntRect &area, Geom::Affine const &m);
/**
diff --git a/src/display/nr-filter-skeleton.h b/src/display/nr-filter-skeleton.h
index 049c0df80..e17c244c1 100644
--- a/src/display/nr-filter-skeleton.h
+++ b/src/display/nr-filter-skeleton.h
@@ -1,5 +1,5 @@
-#ifndef __NR_FILTER_SKELETON_H__
-#define __NR_FILTER_SKELETON_H__
+#ifndef SEEN_NR_FILTER_SKELETON_H
+#define SEEN_NR_FILTER_SKELETON_H
/*
* Filter primitive renderer skeleton class
diff --git a/src/display/nr-filter-slot.h b/src/display/nr-filter-slot.h
index f3c98b8d9..987dedfd1 100644
--- a/src/display/nr-filter-slot.h
+++ b/src/display/nr-filter-slot.h
@@ -1,5 +1,5 @@
-#ifndef __NR_FILTER_SLOT_H__
-#define __NR_FILTER_SLOT_H__
+#ifndef SEEN_NR_FILTER_SLOT_H
+#define SEEN_NR_FILTER_SLOT_H
/*
* A container class for filter slots. Allows for simple getting and
@@ -15,10 +15,14 @@
*/
#include <map>
-#include <cairo.h>
#include "display/nr-filter-types.h"
#include "display/nr-filter-units.h"
+extern "C" {
+typedef struct _cairo cairo_t;
+typedef struct _cairo_surface cairo_surface_t;
+}
+
namespace Inkscape {
class DrawingContext;
class DrawingItem;
diff --git a/src/display/nr-filter-specularlighting.h b/src/display/nr-filter-specularlighting.h
index c57e3a9ff..ff9cda450 100644
--- a/src/display/nr-filter-specularlighting.h
+++ b/src/display/nr-filter-specularlighting.h
@@ -1,5 +1,5 @@
-#ifndef __NR_FILTER_SPECULARLIGHTING_H__
-#define __NR_FILTER_SPECULARLIGHTING_H__
+#ifndef SEEN_NR_FILTER_SPECULARLIGHTING_H
+#define SEEN_NR_FILTER_SPECULARLIGHTING_H
/*
* feSpecularLighting renderer
@@ -13,7 +13,6 @@
* Released under GNU GPL, read the file 'COPYING' for more information
*/
-#include <gdk/gdk.h>
#include "display/nr-light-types.h"
#include "display/nr-filter-primitive.h"
@@ -21,6 +20,7 @@ class SPFeDistantLight;
class SPFePointLight;
class SPFeSpotLight;
struct SVGICCColor;
+typedef unsigned int guint32;
namespace Inkscape {
namespace Filters {
@@ -44,9 +44,9 @@ public:
SPFeSpotLight *spot;
} light;
LightType light_type;
- gdouble surfaceScale;
- gdouble specularConstant;
- gdouble specularExponent;
+ double surfaceScale;
+ double specularConstant;
+ double specularExponent;
guint32 lighting_color;
private:
diff --git a/src/display/nr-filter-tile.h b/src/display/nr-filter-tile.h
index dc5b99a42..29087f2d6 100644
--- a/src/display/nr-filter-tile.h
+++ b/src/display/nr-filter-tile.h
@@ -1,5 +1,5 @@
-#ifndef __NR_FILTER_TILE_H__
-#define __NR_FILTER_TILE_H__
+#ifndef SEEN_NR_FILTER_TILE_H
+#define SEEN_NR_FILTER_TILE_H
/*
* feTile filter primitive renderer
diff --git a/src/display/nr-filter-turbulence.h b/src/display/nr-filter-turbulence.h
index 360853364..ee8079133 100644
--- a/src/display/nr-filter-turbulence.h
+++ b/src/display/nr-filter-turbulence.h
@@ -1,5 +1,5 @@
-#ifndef __NR_FILTER_TURBULENCE_H__
-#define __NR_FILTER_TURBULENCE_H__
+#ifndef SEEN_NR_FILTER_TURBULENCE_H
+#define SEEN_NR_FILTER_TURBULENCE_H
/*
* feTurbulence filter primitive renderer
@@ -22,6 +22,7 @@
*/
#include <2geom/point.h>
+
#include "display/nr-filter-primitive.h"
#include "display/nr-filter-slot.h"
#include "display/nr-filter-units.h"
diff --git a/src/display/nr-filter-types.h b/src/display/nr-filter-types.h
index 502bfe348..2e35d6da8 100644
--- a/src/display/nr-filter-types.h
+++ b/src/display/nr-filter-types.h
@@ -1,5 +1,5 @@
-#ifndef __NR_FILTER_TYPES_H__
-#define __NR_FILTER_TYPES_H__
+#ifndef SEEN_NR_FILTER_TYPES_H
+#define SEEN_NR_FILTER_TYPES_H
namespace Inkscape {
namespace Filters {
diff --git a/src/display/nr-filter-units.h b/src/display/nr-filter-units.h
index f918cf12e..0ee6c3707 100644
--- a/src/display/nr-filter-units.h
+++ b/src/display/nr-filter-units.h
@@ -1,5 +1,5 @@
-#ifndef __NR_FILTER_UNITS_H__
-#define __NR_FILTER_UNITS_H__
+#ifndef SEEN_NR_FILTER_UNITS_H
+#define SEEN_NR_FILTER_UNITS_H
/*
* Utilities for handling coordinate system transformations in filters
diff --git a/src/display/nr-filter-utils.h b/src/display/nr-filter-utils.h
index 7e073168f..35a74d7c1 100644
--- a/src/display/nr-filter-utils.h
+++ b/src/display/nr-filter-utils.h
@@ -1,5 +1,5 @@
-#ifndef __NR_FILTER_UTILS_H__
-#define __NR_FILTER_UTILS_H__
+#ifndef SEEN_NR_FILTER_UTILS_H
+#define SEEN_NR_FILTER_UTILS_H
/**
* @file
@@ -26,7 +26,6 @@ namespace Filters {
* \return 0 if the value is smaller than 0, 255 if it is greater 255, else v
* \param v the value to clamp
*/
-__attribute__ ((const))
inline int clamp(int const val) {
if (val < 0) return 0;
if (val > 255) return 255;
@@ -39,7 +38,6 @@ inline int clamp(int const val) {
* \return 0 if the value is smaller than 0, 255^3 (16581375) if it is greater than 255^3, else v
* \param v the value to clamp
*/
-__attribute__ ((const))
inline int clamp3(int const val) {
if (val < 0) return 0;
if (val > 16581375) return 16581375;
@@ -59,7 +57,6 @@ inline int clamp3(int const val) {
* \param val the value to clamp
* \param alpha the maximum value to clamp to
*/
-__attribute__ ((const))
inline int clamp_alpha(int const val, int const alpha) {
if (val < 0) return 0;
if (val > alpha) return alpha;
diff --git a/src/display/nr-filter.cpp b/src/display/nr-filter.cpp
index 90b233fbc..dec5b1f57 100644
--- a/src/display/nr-filter.cpp
+++ b/src/display/nr-filter.cpp
@@ -9,7 +9,6 @@
* Released under GNU GPL, read the file 'COPYING' for more information
*/
-#include "display/nr-filter-image.h"
#include <glib.h>
#include <cmath>
#include <cstring>
@@ -29,6 +28,7 @@
#include "display/nr-filter-component-transfer.h"
#include "display/nr-filter-diffuselighting.h"
#include "display/nr-filter-displacement-map.h"
+#include "display/nr-filter-image.h"
#include "display/nr-filter-flood.h"
#include "display/nr-filter-gaussian.h"
#include "display/nr-filter-merge.h"
diff --git a/src/display/nr-filter.h b/src/display/nr-filter.h
index f9dcf1d84..9a30efabd 100644
--- a/src/display/nr-filter.h
+++ b/src/display/nr-filter.h
@@ -1,5 +1,5 @@
-#ifndef __NR_FILTER_H__
-#define __NR_FILTER_H__
+#ifndef SEEN_NR_FILTER_H
+#define SEEN_NR_FILTER_H
/*
* SVG filters rendering
diff --git a/src/display/nr-light-types.h b/src/display/nr-light-types.h
index 5c9acb324..8cc92db77 100644
--- a/src/display/nr-light-types.h
+++ b/src/display/nr-light-types.h
@@ -1,5 +1,5 @@
-#ifndef __NR_LIGHT_TYPES_H__
-#define __NR_LIGHT_TYPES_H__
+#ifndef SEEN_NR_LIGHT_TYPES_H
+#define SEEN_NR_LIGHT_TYPES_H
namespace Inkscape {
namespace Filters {
diff --git a/src/display/nr-light.cpp b/src/display/nr-light.cpp
index 6331d1546..0e9a55a9f 100644
--- a/src/display/nr-light.cpp
+++ b/src/display/nr-light.cpp
@@ -51,7 +51,7 @@ PointLight::PointLight(SPFePointLight *light, guint32 lighting_color, const Geom
PointLight::~PointLight() {}
-void PointLight::light_vector(NR::Fvector &v, gdouble x, gdouble y, gdouble z) {
+void PointLight::light_vector(NR::Fvector &v, double x, double y, double z) {
v[X_3D] = l_x - x;
v[Y_3D] = l_y - y;
v[Z_3D] = l_z - z;
@@ -65,7 +65,7 @@ void PointLight::light_components(NR::Fvector &lc) {
}
SpotLight::SpotLight(SPFeSpotLight *light, guint32 lighting_color, const Geom::Affine &trans) {
- gdouble p_x, p_y, p_z;
+ double p_x, p_y, p_z;
color = lighting_color;
l_x = light->x;
l_y = light->y;
@@ -86,7 +86,7 @@ SpotLight::SpotLight(SPFeSpotLight *light, guint32 lighting_color, const Geom::A
SpotLight::~SpotLight() {}
-void SpotLight::light_vector(NR::Fvector &v, gdouble x, gdouble y, gdouble z) {
+void SpotLight::light_vector(NR::Fvector &v, double x, double y, double z) {
v[X_3D] = l_x - x;
v[Y_3D] = l_y - y;
v[Z_3D] = l_z - z;
@@ -94,7 +94,7 @@ void SpotLight::light_vector(NR::Fvector &v, gdouble x, gdouble y, gdouble z) {
}
void SpotLight::light_components(NR::Fvector &lc, const NR::Fvector &L) {
- gdouble spmod = (-1) * NR::scalar_product(L, S);
+ double spmod = (-1) * NR::scalar_product(L, S);
if (spmod <= cos_lca)
spmod = 0;
else
diff --git a/src/display/nr-light.h b/src/display/nr-light.h
index 0c1235483..94b573761 100644
--- a/src/display/nr-light.h
+++ b/src/display/nr-light.h
@@ -1,5 +1,6 @@
-#ifndef __NR_LIGHT_H__
-#define __NR_LIGHT_H__
+#ifndef SEEN_NR_LIGHT_H
+#define SEEN_NR_LIGHT_H
+
/** \file
* These classes provide tools to compute interesting objects relative to light
* sources. Each class provides a constructor converting information contained
@@ -8,14 +9,15 @@
* light color components (at a given point).
*/
-#include <gdk/gdk.h>
+#include <2geom/forward.h>
+
#include "display/nr-3dutils.h"
#include "display/nr-light-types.h"
-#include <2geom/forward.h>
class SPFeDistantLight;
class SPFePointLight;
class SPFeSpotLight;
+typedef unsigned int guint32;
namespace Inkscape {
namespace Filters {
@@ -53,8 +55,8 @@ class DistantLight {
private:
guint32 color;
- gdouble azimuth; //azimuth in rad
- gdouble elevation; //elevation in rad
+ double azimuth; //azimuth in rad
+ double elevation; //elevation in rad
};
class PointLight {
@@ -80,7 +82,7 @@ class PointLight {
* \param y y coordinate of the current point
* \param z z coordinate of the current point
*/
- void light_vector(NR::Fvector &v, gdouble x, gdouble y, gdouble z);
+ void light_vector(NR::Fvector &v, double x, double y, double z);
/**
* Computes the light components of the distant light
@@ -92,9 +94,9 @@ class PointLight {
private:
guint32 color;
//light position coordinates in render setting
- gdouble l_x;
- gdouble l_y;
- gdouble l_z;
+ double l_x;
+ double l_y;
+ double l_z;
};
class SpotLight {
@@ -121,7 +123,7 @@ class SpotLight {
* \param y y coordinate of the current point
* \param z z coordinate of the current point
*/
- void light_vector(NR::Fvector &v, gdouble x, gdouble y, gdouble z);
+ void light_vector(NR::Fvector &v, double x, double y, double z);
/**
* Computes the light components of the distant light at the current
@@ -135,11 +137,11 @@ class SpotLight {
private:
guint32 color;
//light position coordinates in render setting
- gdouble l_x;
- gdouble l_y;
- gdouble l_z;
- gdouble cos_lca; //cos of the limiting cone angle
- gdouble speExp; //specular exponent;
+ double l_x;
+ double l_y;
+ double l_z;
+ double cos_lca; //cos of the limiting cone angle
+ double speExp; //specular exponent;
NR::Fvector S; //unit vector from light position in the direction
//the spot point at
};
diff --git a/src/display/nr-svgfonts.h b/src/display/nr-svgfonts.h
index e1bb047bb..21ab3ed02 100644
--- a/src/display/nr-svgfonts.h
+++ b/src/display/nr-svgfonts.h
@@ -1,4 +1,3 @@
-#include "config.h"
#ifndef NR_SVGFONTS_H_SEEN
#define NR_SVGFONTS_H_SEEN
/*
@@ -13,7 +12,7 @@
* Read the file 'COPYING' for more information.
*/
-#include "cairo.h"
+#include <cairo.h>
#include <sigc++/connection.h>
class SvgFont;
@@ -21,40 +20,50 @@ class SPFont;
class SPGlyph;
class SPMissingGlyph;
-struct _GdkEventExpose;
-typedef _GdkEventExpose GdkEventExpose;
+extern "C" { typedef struct _GdkEventExpose GdkEventExpose; }
namespace Gtk {
class Widget;
}
-class UserFont{
+class UserFont {
public:
-UserFont(SvgFont* instance);
-cairo_font_face_t* face;
+ UserFont(SvgFont* instance);
+ cairo_font_face_t* face;
};
-class SvgFont{
+class SvgFont {
public:
-SvgFont(SPFont* spfont);
-void refresh();
-cairo_font_face_t* get_font_face();
-cairo_status_t scaled_font_init (cairo_scaled_font_t *scaled_font, cairo_font_extents_t *metrics);
-cairo_status_t scaled_font_text_to_glyphs (cairo_scaled_font_t *scaled_font, const char *utf8, int utf8_len, cairo_glyph_t **glyphs, int *num_glyphs, cairo_text_cluster_t **clusters, int *num_clusters, cairo_text_cluster_flags_t *flags);
-cairo_status_t scaled_font_render_glyph (cairo_scaled_font_t *scaled_font, unsigned long glyph, cairo_t *cr, cairo_text_extents_t *metrics);
+ SvgFont(SPFont* spfont);
+ void refresh();
+ cairo_font_face_t* get_font_face();
+ cairo_status_t scaled_font_init (cairo_scaled_font_t *scaled_font, cairo_font_extents_t *metrics);
+ cairo_status_t scaled_font_text_to_glyphs (cairo_scaled_font_t *scaled_font, const char *utf8, int utf8_len, cairo_glyph_t **glyphs, int *num_glyphs, cairo_text_cluster_t **clusters, int *num_clusters, cairo_text_cluster_flags_t *flags);
+ cairo_status_t scaled_font_render_glyph (cairo_scaled_font_t *scaled_font, unsigned long glyph, cairo_t *cr, cairo_text_extents_t *metrics);
-Geom::PathVector flip_coordinate_system(SPFont* spfont, Geom::PathVector pathv);
-void render_glyph_path(cairo_t* cr, Geom::PathVector* pathv);
-void glyph_modified(SPObject *, unsigned int);
+ Geom::PathVector flip_coordinate_system(SPFont* spfont, Geom::PathVector pathv);
+ void render_glyph_path(cairo_t* cr, Geom::PathVector* pathv);
+ void glyph_modified(SPObject *, unsigned int);
private:
-SPFont* font;
-UserFont* userfont;
-std::vector<SPGlyph*> glyphs;
-SPMissingGlyph* missingglyph;
-sigc::connection glyph_modified_connection;
+ SPFont* font;
+ UserFont* userfont;
+ std::vector<SPGlyph*> glyphs;
+ SPMissingGlyph* missingglyph;
+ sigc::connection glyph_modified_connection;
-bool drawing_expose_cb (Gtk::Widget *widget, GdkEventExpose *event, gpointer data);
+ bool drawing_expose_cb (Gtk::Widget *widget, GdkEventExpose *event, void* data);
};
#endif //#ifndef NR_SVGFONTS_H_SEEN
+
+/*
+ Local Variables:
+ mode:c++
+ c-file-style:"stroustrup"
+ c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
+ indent-tabs-mode:nil
+ fill-column:99
+ End:
+*/
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8 :
diff --git a/src/display/snap-indicator.cpp b/src/display/snap-indicator.cpp
index 3a8358174..2632d69db 100644
--- a/src/display/snap-indicator.cpp
+++ b/src/display/snap-indicator.cpp
@@ -22,7 +22,7 @@
#include "knot.h"
#include "preferences.h"
#include <glibmm/i18n.h>
-#include "tools-switch.h"
+#include "ui/tools-switch.h"
#include "enums.h"
namespace Inkscape {
diff --git a/src/display/sodipodi-ctrl.cpp b/src/display/sodipodi-ctrl.cpp
index 3636319df..327fbce1f 100644
--- a/src/display/sodipodi-ctrl.cpp
+++ b/src/display/sodipodi-ctrl.cpp
@@ -25,9 +25,6 @@ enum {
ARG_PIXBUF
};
-
-static void sp_ctrl_class_init (SPCtrlClass *klass);
-static void sp_ctrl_init (SPCtrl *ctrl);
static void sp_ctrl_destroy(SPCanvasItem *object);
static void sp_ctrl_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec);
static void sp_ctrl_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec);
@@ -36,29 +33,7 @@ static void sp_ctrl_render (SPCanvasItem *item, SPCanvasBuf *buf);
static double sp_ctrl_point (SPCanvasItem *item, Geom::Point p, SPCanvasItem **actual_item);
-static SPCanvasItemClass *parent_class;
-
-GType
-sp_ctrl_get_type (void)
-{
- static GType ctrl_type = 0;
- if (!ctrl_type) {
- static GTypeInfo const ctrl_info = {
- sizeof (SPCtrlClass),
- NULL, /* base_init */
- NULL, /* base_finalize */
- (GClassInitFunc) sp_ctrl_class_init,
- NULL, /* class_finalize */
- NULL, /* class_data */
- sizeof (SPCtrl),
- 0, /* n_preallocs */
- (GInstanceInitFunc) sp_ctrl_init,
- NULL
- };
- ctrl_type = g_type_register_static (SP_TYPE_CANVAS_ITEM, "SPCtrl", &ctrl_info, (GTypeFlags)0);
- }
- return ctrl_type;
-}
+G_DEFINE_TYPE(SPCtrl, sp_ctrl, SP_TYPE_CANVAS_ITEM);
static void
sp_ctrl_class_init (SPCtrlClass *klass)
@@ -66,8 +41,6 @@ sp_ctrl_class_init (SPCtrlClass *klass)
SPCanvasItemClass *item_class = SP_CANVAS_ITEM_CLASS(klass);
GObjectClass *g_object_class = (GObjectClass *) klass;
- parent_class = SP_CANVAS_ITEM_CLASS(g_type_class_peek_parent (klass));
-
g_object_class->set_property = sp_ctrl_set_property;
g_object_class->get_property = sp_ctrl_get_property;
@@ -239,8 +212,8 @@ static void sp_ctrl_destroy(SPCanvasItem *object)
ctrl->cache = NULL;
}
- if (SP_CANVAS_ITEM_CLASS(parent_class)->destroy)
- (* SP_CANVAS_ITEM_CLASS(parent_class)->destroy) (object);
+ if (SP_CANVAS_ITEM_CLASS(sp_ctrl_parent_class)->destroy)
+ SP_CANVAS_ITEM_CLASS(sp_ctrl_parent_class)->destroy(object);
}
static void
@@ -251,8 +224,8 @@ sp_ctrl_update (SPCanvasItem *item, Geom::Affine const &affine, unsigned int fla
ctrl = SP_CTRL (item);
- if ((SP_CANVAS_ITEM_CLASS(parent_class))->update)
- (* (SP_CANVAS_ITEM_CLASS(parent_class))->update) (item, affine, flags);
+ if (SP_CANVAS_ITEM_CLASS(sp_ctrl_parent_class)->update)
+ SP_CANVAS_ITEM_CLASS(sp_ctrl_parent_class)->update(item, affine, flags);
sp_canvas_item_reset_bounds (item);
diff --git a/src/display/sodipodi-ctrlrect.cpp b/src/display/sodipodi-ctrlrect.cpp
index e6e427047..75789ff50 100644
--- a/src/display/sodipodi-ctrlrect.cpp
+++ b/src/display/sodipodi-ctrlrect.cpp
@@ -26,45 +26,19 @@
* Corner coords can be in any order - i.e. x1 < x0 is allowed
*/
-static void sp_ctrlrect_class_init(SPCtrlRectClass *c);
-static void sp_ctrlrect_init(CtrlRect *ctrlrect);
static void sp_ctrlrect_destroy(SPCanvasItem *object);
static void sp_ctrlrect_update(SPCanvasItem *item, Geom::Affine const &affine, unsigned int flags);
static void sp_ctrlrect_render(SPCanvasItem *item, SPCanvasBuf *buf);
-static SPCanvasItemClass *parent_class;
-
static const guint DASH_LENGTH = 4;
-GType sp_ctrlrect_get_type()
-{
- static GType type = 0;
-
- if (!type) {
- GTypeInfo info = {
- sizeof(SPCtrlRectClass),
- 0, // base_init
- 0, // base_finalize
- (GClassInitFunc)sp_ctrlrect_class_init,
- 0, // class_finalize
- 0, // class_data
- sizeof(CtrlRect),
- 0, // n_preallocs
- (GInstanceInitFunc)sp_ctrlrect_init,
- 0 // value_table
- };
- type = g_type_register_static(SP_TYPE_CANVAS_ITEM, "SPCtrlRect", &info, static_cast<GTypeFlags>(0));
- }
- return type;
-}
+G_DEFINE_TYPE(CtrlRect, sp_ctrlrect, SP_TYPE_CANVAS_ITEM);
-static void sp_ctrlrect_class_init(SPCtrlRectClass *c)
+static void sp_ctrlrect_class_init(CtrlRectClass *c)
{
SPCanvasItemClass *item_class = SP_CANVAS_ITEM_CLASS(c);
- parent_class = SP_CANVAS_ITEM_CLASS(g_type_class_peek_parent(c));
-
item_class->destroy = sp_ctrlrect_destroy;
item_class->update = sp_ctrlrect_update;
item_class->render = sp_ctrlrect_render;
@@ -77,8 +51,8 @@ static void sp_ctrlrect_init(CtrlRect *cr)
static void sp_ctrlrect_destroy(SPCanvasItem *object)
{
- if (SP_CANVAS_ITEM_CLASS(parent_class)->destroy) {
- (* SP_CANVAS_ITEM_CLASS(parent_class)->destroy)(object);
+ if (SP_CANVAS_ITEM_CLASS(sp_ctrlrect_parent_class)->destroy) {
+ (* SP_CANVAS_ITEM_CLASS(sp_ctrlrect_parent_class)->destroy)(object);
}
}
@@ -171,8 +145,8 @@ void CtrlRect::update(Geom::Affine const &affine, unsigned int flags)
using Geom::X;
using Geom::Y;
- if ((SP_CANVAS_ITEM_CLASS(parent_class))->update) {
- (SP_CANVAS_ITEM_CLASS(parent_class))->update(this, affine, flags);
+ if ((SP_CANVAS_ITEM_CLASS(sp_ctrlrect_parent_class))->update) {
+ (SP_CANVAS_ITEM_CLASS(sp_ctrlrect_parent_class))->update(this, affine, flags);
}
sp_canvas_item_reset_bounds(this);
diff --git a/src/display/sodipodi-ctrlrect.h b/src/display/sodipodi-ctrlrect.h
index 65a40a850..ff6c55b06 100644
--- a/src/display/sodipodi-ctrlrect.h
+++ b/src/display/sodipodi-ctrlrect.h
@@ -26,7 +26,7 @@ struct SPCanvasBuf;
#define SP_TYPE_CTRLRECT (sp_ctrlrect_get_type ())
#define SP_CTRLRECT(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), SP_TYPE_CTRLRECT, CtrlRect))
-#define SP_CTRLRECT_CLASS(c) (G_TYPE_CHECK_CLASS_CAST((c), SP_TYPE_CTRLRECT, SPCtrlRectClass))
+#define SP_CTRLRECT_CLASS(c) (G_TYPE_CHECK_CLASS_CAST((c), SP_TYPE_CTRLRECT, CtrlRectClass))
#define SP_IS_CTRLRECT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), SP_TYPE_CTRLRECT))
#define SP_IS_CTRLRECT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), SP_TYPE_CTRLRECT))
@@ -57,7 +57,7 @@ private:
int _shadow;
};
-struct SPCtrlRectClass : public SPCanvasItemClass {};
+struct CtrlRectClass : public SPCanvasItemClass {};
GType sp_ctrlrect_get_type();
diff --git a/src/display/sp-canvas-item.h b/src/display/sp-canvas-item.h
index f34ec453c..3b7b7bd4f 100644
--- a/src/display/sp-canvas-item.h
+++ b/src/display/sp-canvas-item.h
@@ -23,10 +23,9 @@
# include "config.h"
#endif
-#include <glib-object.h>
-#include <gtk/gtk.h>
-#include <gdk/gdk.h>
#include <2geom/rect.h>
+#include <glib-object.h>
+
#include "ui/control-types.h"
G_BEGIN_DECLS
@@ -36,8 +35,10 @@ struct SPCanvasBuf;
struct SPCanvasGroup;
typedef struct _SPCanvasItemClass SPCanvasItemClass;
+typedef union _GdkEvent GdkEvent;
+typedef struct _GdkCursor GdkCursor;
-#define SP_TYPE_CANVAS_ITEM (SPCanvasItem::getType())
+#define SP_TYPE_CANVAS_ITEM (sp_canvas_item_get_type())
#define SP_CANVAS_ITEM(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), SP_TYPE_CANVAS_ITEM, SPCanvasItem))
#define SP_CANVAS_ITEM_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), SP_TYPE_CANVAS_ITEM, SPCanvasItemClass))
#define SP_IS_CANVAS_ITEM(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), SP_TYPE_CANVAS_ITEM))
@@ -50,7 +51,6 @@ typedef struct _SPCanvasItemClass SPCanvasItemClass;
*/
struct SPCanvasItem {
GInitiallyUnowned parent_instance;
- static GType getType();
SPCanvas *canvas;
SPCanvasItem *parent;
@@ -73,6 +73,8 @@ struct SPCanvasItem {
bool in_destruction;
};
+GType sp_canvas_item_get_type();
+
/**
* The vtable of an SPCanvasItem.
*/
diff --git a/src/display/sp-canvas-util.h b/src/display/sp-canvas-util.h
index 07323f31a..73135ed79 100644
--- a/src/display/sp-canvas-util.h
+++ b/src/display/sp-canvas-util.h
@@ -1,5 +1,5 @@
-#ifndef __SP_CANVAS_UTILS_H__
-#define __SP_CANVAS_UTILS_H__
+#ifndef SEEN_SP_CANVAS_UTILS_H
+#define SEEN_SP_CANVAS_UTILS_H
/*
* Helper stuff for SPCanvas
@@ -19,7 +19,7 @@ struct SPCanvasItem;
struct SPCanvasBuf;
namespace Geom {
- class Affine;
+ class Affine;
}
/* Miscellaneous utility & convenience functions for general canvas objects */
diff --git a/src/display/sp-canvas.cpp b/src/display/sp-canvas.cpp
index 3dc4a7504..305b0950a 100644
--- a/src/display/sp-canvas.cpp
+++ b/src/display/sp-canvas.cpp
@@ -61,8 +61,6 @@ struct SPCanvasGroupClass {
* A group of Items.
*/
struct SPCanvasGroup {
- static GType getType();
-
/**
* Adds an item to a canvas group.
*/
@@ -113,17 +111,8 @@ struct SPCanvasGroup {
GList *items;
GList *last;
-
- static SPCanvasItemClass *parentClass;
};
-SPCanvasItemClass *SPCanvasGroup::parentClass;
-
-GType sp_canvas_group_get_type()
-{
- return SPCanvasGroup::getType();
-}
-
/**
* The SPCanvas vtable.
*/
@@ -161,19 +150,6 @@ enum {
LAST_SIGNAL
};
-void sp_canvas_item_base_class_init(SPCanvasItemClass *klass);
-void sp_canvas_item_base_class_finalize(SPCanvasItemClass *klass);
-
-/**
- * Initializes the SPCanvasItem vtable and the "event" signal.
- */
-void sp_canvas_item_class_init(SPCanvasItemClass *klass);
-
-/**
- * Callback for initialization of SPCanvasItem.
- */
-void sp_canvas_item_init(SPCanvasItem *item, SPCanvasItemClass *klass);
-
/**
* Callback that removes item from all referers and destroys it.
*/
@@ -181,7 +157,6 @@ void sp_canvas_item_dispose(GObject *object);
void sp_canvas_item_finalize(GObject *object);
void sp_canvas_item_real_destroy(SPCanvasItem *object);
-static gpointer parent_class = NULL;
static guint object_signals[LAST_SIGNAL] = { 0 };
/**
@@ -358,45 +333,12 @@ public:
static void requestCanvasUpdate(SPCanvas *canvas);
};
-GType SPCanvasItem::getType()
-{
- static GType object_type = 0;
-
- if (!object_type) {
- static GTypeInfo const object_info = {
- sizeof(SPCanvasItemClass),
- reinterpret_cast<GBaseInitFunc>(sp_canvas_item_base_class_init),
- reinterpret_cast<GBaseFinalizeFunc>(sp_canvas_item_base_class_finalize),
- reinterpret_cast<GClassInitFunc>(sp_canvas_item_class_init),
- NULL, // class_finalize
- NULL, // class_data
- sizeof(SPCanvasItem),
- 16, // n_preallocs
- reinterpret_cast<GInstanceInitFunc>(sp_canvas_item_init),
- NULL // value_table
- };
-
- object_type = g_type_register_static(G_TYPE_INITIALLY_UNOWNED,
- "SPCanvasItem", &object_info, GTypeFlags(0));
- }
-
- return object_type;
-}
-
-namespace {
-
-void sp_canvas_item_base_class_init(SPCanvasItemClass * /*klass*/)
-{
-}
-
-void sp_canvas_item_base_class_finalize(SPCanvasItemClass * /*klass*/)
-{
-}
+G_DEFINE_TYPE(SPCanvasItem, sp_canvas_item, G_TYPE_INITIALLY_UNOWNED);
-void sp_canvas_item_class_init(SPCanvasItemClass *klass)
+static void
+sp_canvas_item_class_init(SPCanvasItemClass *klass)
{
GObjectClass *gobject_class = (GObjectClass *) klass;
- parent_class = g_type_class_ref (G_TYPE_OBJECT);
item_signals[ITEM_EVENT] = g_signal_new ("event",
G_TYPE_FROM_CLASS (klass),
@@ -421,7 +363,8 @@ void sp_canvas_item_class_init(SPCanvasItemClass *klass)
G_TYPE_NONE, 0);
}
-void sp_canvas_item_init(SPCanvasItem *item, SPCanvasItemClass * /*klass*/)
+static void
+sp_canvas_item_init(SPCanvasItem *item)
{
item->xform = Geom::Affine(Geom::identity());
item->ctrlType = Inkscape::CTRL_TYPE_UNKNOWN;
@@ -434,15 +377,13 @@ void sp_canvas_item_init(SPCanvasItem *item, SPCanvasItemClass * /*klass*/)
item->in_destruction = false;
}
-} // namespace
-
SPCanvasItem *sp_canvas_item_new(SPCanvasGroup *parent, GType type, gchar const *first_arg_name, ...)
{
va_list args;
g_return_val_if_fail(parent != NULL, NULL);
g_return_val_if_fail(SP_IS_CANVAS_GROUP(parent), NULL);
- g_return_val_if_fail(g_type_is_a(type, SPCanvasItem::getType()), NULL);
+ g_return_val_if_fail(g_type_is_a(type, SP_TYPE_CANVAS_ITEM), NULL);
SPCanvasItem *item = SP_CANVAS_ITEM(g_object_new(type, NULL));
@@ -554,7 +495,7 @@ void sp_canvas_item_dispose(GObject *object)
item->in_destruction = false;
}
- G_OBJECT_CLASS(parent_class)->dispose(object);
+ G_OBJECT_CLASS(sp_canvas_item_parent_class)->dispose(object);
}
void sp_canvas_item_real_destroy(SPCanvasItem *object)
@@ -574,7 +515,7 @@ void sp_canvas_item_finalize(GObject *gobject)
"and must be removed with g_object_ref_sink().");
}
- G_OBJECT_CLASS (parent_class)->finalize (gobject);
+ G_OBJECT_CLASS (sp_canvas_item_parent_class)->finalize (gobject);
}
} // namespace
@@ -982,37 +923,12 @@ gint sp_canvas_item_order (SPCanvasItem * item)
}
// SPCanvasGroup
+G_DEFINE_TYPE(SPCanvasGroup, sp_canvas_group, SP_TYPE_CANVAS_ITEM);
-/**
- * Registers SPCanvasGroup class with Gtk and returns its type number.
- */
-GType SPCanvasGroup::getType(void)
-{
- static GType type = 0;
- if (!type) {
- GTypeInfo info = {
- sizeof(SPCanvasGroupClass),
- 0, // base_init
- 0, // base_finalize
- reinterpret_cast<GClassInitFunc>(SPCanvasGroup::classInit),
- 0, // class_finalize
- 0, // class_data
- sizeof(SPCanvasGroup),
- 0, // n_preallocs
- reinterpret_cast<GInstanceInitFunc>(SPCanvasGroup::init),
- 0 // value_table
- };
- type = g_type_register_static(SPCanvasItem::getType(), "SPCanvasGroup", &info, static_cast<GTypeFlags>(0));
- }
- return type;
-}
-
-void SPCanvasGroup::classInit(SPCanvasGroupClass *klass)
+static void sp_canvas_group_class_init(SPCanvasGroupClass *klass)
{
SPCanvasItemClass *item_class = reinterpret_cast<SPCanvasItemClass *>(klass);
- parentClass = reinterpret_cast<SPCanvasItemClass*>(g_type_class_peek_parent(klass));
-
item_class->destroy = SPCanvasGroup::destroy;
item_class->update = SPCanvasGroup::update;
item_class->render = SPCanvasGroup::render;
@@ -1020,7 +936,7 @@ void SPCanvasGroup::classInit(SPCanvasGroupClass *klass)
item_class->viewbox_changed = SPCanvasGroup::viewboxChanged;
}
-void SPCanvasGroup::init(SPCanvasGroup * /*group*/)
+static void sp_canvas_group_init(SPCanvasGroup * /*group*/)
{
// Nothing here
}
@@ -1040,8 +956,8 @@ void SPCanvasGroup::destroy(SPCanvasItem *object)
sp_canvas_item_destroy(child);
}
- if (SP_CANVAS_ITEM_CLASS(parentClass)->destroy) {
- (* SP_CANVAS_ITEM_CLASS(parentClass)->destroy)(object);
+ if (SP_CANVAS_ITEM_CLASS(sp_canvas_group_parent_class)->destroy) {
+ (* SP_CANVAS_ITEM_CLASS(sp_canvas_group_parent_class)->destroy)(object);
}
}
@@ -1238,7 +1154,7 @@ sp_canvas_init(SPCanvas *canvas)
canvas->pick_event.crossing.y = 0;
// Create the root item as a special case
- canvas->root = SP_CANVAS_ITEM(g_object_new(SPCanvasGroup::getType(), NULL));
+ canvas->root = SP_CANVAS_ITEM(g_object_new(SP_TYPE_CANVAS_GROUP, NULL));
canvas->root->canvas = canvas;
g_object_ref (canvas->root);
diff --git a/src/display/sp-canvas.h b/src/display/sp-canvas.h
index 72ae4b6bc..48c3de2fc 100644
--- a/src/display/sp-canvas.h
+++ b/src/display/sp-canvas.h
@@ -22,16 +22,6 @@
# include "config.h"
#endif
-#ifdef HAVE_INTTYPES_H
-# include <inttypes.h>
-#else
-# ifdef HAVE_STDINT_H
-# include <stdint.h>
-# endif
-#endif
-
-#include <glib.h>
-#include <gdk/gdk.h>
#include <gtk/gtk.h>
#include <glibmm/ustring.h>
#include <2geom/affine.h>
diff --git a/src/display/sp-ctrlcurve.cpp b/src/display/sp-ctrlcurve.cpp
index d9b687f2e..2e0e8105b 100644
--- a/src/display/sp-ctrlcurve.cpp
+++ b/src/display/sp-ctrlcurve.cpp
@@ -23,42 +23,18 @@
namespace {
-static void sp_ctrlcurve_class_init(SPCtrlCurveClass *klass, gpointer data);
-static void sp_ctrlcurve_init(SPCtrlCurve *ctrlcurve, gpointer g_class);
static void sp_ctrlcurve_destroy(SPCanvasItem *object);
static void sp_ctrlcurve_update(SPCanvasItem *item, Geom::Affine const &affine, unsigned int flags);
static void sp_ctrlcurve_render(SPCanvasItem *item, SPCanvasBuf *buf);
-static SPCanvasItemClass *parent_class;
-
} // namespace
-GType SPCtrlCurve::getType()
-{
- static GType type = 0;
- if (!type) {
- GTypeInfo info = {
- sizeof(SPCtrlCurveClass),
- NULL, NULL,
- reinterpret_cast<GClassInitFunc>(sp_ctrlcurve_class_init),
- NULL, NULL,
- sizeof(SPCtrlCurve),
- 0,
- reinterpret_cast<GInstanceInitFunc>(sp_ctrlcurve_init),
- NULL
- };
- type = g_type_register_static(SP_TYPE_CANVAS_ITEM, "SPCtrlCurve", &info, static_cast<GTypeFlags>(0));
- }
- return type;
-}
+G_DEFINE_TYPE(SPCtrlCurve, sp_ctrlcurve, SP_TYPE_CANVAS_ITEM);
-namespace {
-
-void sp_ctrlcurve_class_init(SPCtrlCurveClass *klass, gpointer /*g_class*/)
+static void
+sp_ctrlcurve_class_init(SPCtrlCurveClass *klass)
{
- parent_class = reinterpret_cast<SPCanvasItemClass*>(g_type_class_peek_parent(klass));
-
klass->destroy = sp_ctrlcurve_destroy;
klass->update = sp_ctrlcurve_update;
@@ -66,13 +42,14 @@ void sp_ctrlcurve_class_init(SPCtrlCurveClass *klass, gpointer /*g_class*/)
}
static void
-sp_ctrlcurve_init(SPCtrlCurve *ctrlcurve, gpointer /*g_class*/)
+sp_ctrlcurve_init(SPCtrlCurve *ctrlcurve)
{
// Points are initialized to 0,0
ctrlcurve->rgba = 0x0000ff7f;
ctrlcurve->item=NULL;
}
+namespace {
static void
sp_ctrlcurve_destroy(SPCanvasItem *object)
{
@@ -83,8 +60,8 @@ sp_ctrlcurve_destroy(SPCanvasItem *object)
ctrlcurve->item=NULL;
- if (SP_CANVAS_ITEM_CLASS (parent_class)->destroy)
- (* SP_CANVAS_ITEM_CLASS (parent_class)->destroy) (object);
+ if (SP_CANVAS_ITEM_CLASS(sp_ctrlcurve_parent_class)->destroy)
+ SP_CANVAS_ITEM_CLASS(sp_ctrlcurve_parent_class)->destroy(object);
}
static void
@@ -125,8 +102,8 @@ sp_ctrlcurve_update(SPCanvasItem *item, Geom::Affine const &affine, unsigned int
item->canvas->requestRedraw(item->x1, item->y1, item->x2, item->y2);
- if (parent_class->update)
- (* parent_class->update) (item, affine, flags);
+ if (SP_CANVAS_ITEM_CLASS(sp_ctrlcurve_parent_class)->update)
+ SP_CANVAS_ITEM_CLASS(sp_ctrlcurve_parent_class)->update(item, affine, flags);
sp_canvas_item_reset_bounds (item);
diff --git a/src/display/sp-ctrlcurve.h b/src/display/sp-ctrlcurve.h
index 90936185c..847944f38 100644
--- a/src/display/sp-ctrlcurve.h
+++ b/src/display/sp-ctrlcurve.h
@@ -19,14 +19,11 @@
class SPItem;
-#define SP_TYPE_CTRLCURVE (SPCtrlCurve::getType())
+#define SP_TYPE_CTRLCURVE (sp_ctrlcurve_get_type())
#define SP_CTRLCURVE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), SP_TYPE_CTRLCURVE, SPCtrlCurve))
#define SP_IS_CTRLCURVE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), SP_TYPE_CTRLCURVE))
struct SPCtrlCurve : public SPCtrlLine {
-
- static GType getType();
-
void setCoords( gdouble x0, gdouble y0, gdouble x1, gdouble y1,
gdouble x2, gdouble y2, gdouble x3, gdouble y3 );
@@ -36,9 +33,9 @@ struct SPCtrlCurve : public SPCtrlLine {
Geom::Point p0, p1, p2, p3;
};
-struct SPCtrlCurveClass : public SPCtrlLineClass{};
-
+GType sp_ctrlcurve_get_type();
+struct SPCtrlCurveClass : public SPCtrlLineClass{};
#endif // SEEN_INKSCAPE_CTRLCURVE_H
diff --git a/src/display/sp-ctrlline.cpp b/src/display/sp-ctrlline.cpp
index aef284c1a..1bde540c0 100644
--- a/src/display/sp-ctrlline.cpp
+++ b/src/display/sp-ctrlline.cpp
@@ -30,55 +30,31 @@
namespace {
-void sp_ctrlline_class_init(SPCtrlLineClass *klass, gpointer data);
-void sp_ctrlline_init(SPCtrlLine *ctrlline, gpointer g_class);
void sp_ctrlline_destroy(SPCanvasItem *object);
void sp_ctrlline_update(SPCanvasItem *item, Geom::Affine const &affine, unsigned int flags);
void sp_ctrlline_render(SPCanvasItem *item, SPCanvasBuf *buf);
-SPCanvasItemClass *parent_class = 0;
-
} // namespace
-GType SPCtrlLine::getType()
-{
- static GType type = 0;
- if (!type) {
- GTypeInfo info = {
- sizeof(SPCtrlLineClass),
- NULL, NULL,
- reinterpret_cast<GClassInitFunc>(sp_ctrlline_class_init),
- NULL, NULL,
- sizeof(SPCtrlLine),
- 0,
- reinterpret_cast<GInstanceInitFunc>(sp_ctrlline_init),
- NULL
- };
- type = g_type_register_static(SP_TYPE_CANVAS_ITEM, "SPCtrlLine", &info, static_cast<GTypeFlags>(0));
- }
- return type;
-}
-
-namespace {
+G_DEFINE_TYPE(SPCtrlLine, sp_ctrlline, SP_TYPE_CANVAS_ITEM);
-void sp_ctrlline_class_init(SPCtrlLineClass *klass, gpointer /*data*/)
+static void sp_ctrlline_class_init(SPCtrlLineClass *klass)
{
- parent_class = reinterpret_cast<SPCanvasItemClass*>(g_type_class_peek_parent(klass));
-
klass->destroy = sp_ctrlline_destroy;
klass->update = sp_ctrlline_update;
klass->render = sp_ctrlline_render;
}
-void sp_ctrlline_init(SPCtrlLine *ctrlline, gpointer /*g_class*/)
+static void sp_ctrlline_init(SPCtrlLine *ctrlline)
{
ctrlline->rgba = 0x0000ff7f;
ctrlline->s[Geom::X] = ctrlline->s[Geom::Y] = ctrlline->e[Geom::X] = ctrlline->e[Geom::Y] = 0.0;
ctrlline->item=NULL;
}
+namespace {
void sp_ctrlline_destroy(SPCanvasItem *object)
{
g_return_if_fail(object != NULL);
@@ -88,8 +64,8 @@ void sp_ctrlline_destroy(SPCanvasItem *object)
ctrlline->item = NULL;
- if(SP_CANVAS_ITEM_CLASS (parent_class)->destroy) {
- (* SP_CANVAS_ITEM_CLASS (parent_class)->destroy)(object);
+ if(SP_CANVAS_ITEM_CLASS (sp_ctrlline_parent_class)->destroy) {
+ SP_CANVAS_ITEM_CLASS (sp_ctrlline_parent_class)->destroy(object);
}
}
@@ -134,8 +110,8 @@ void sp_ctrlline_update(SPCanvasItem *item, Geom::Affine const &affine, unsigned
item->canvas->requestRedraw(item->x1, item->y1, item->x2, item->y2);
- if (parent_class->update) {
- (* parent_class->update)(item, affine, flags);
+ if (SP_CANVAS_ITEM_CLASS(sp_ctrlline_parent_class)->update) {
+ SP_CANVAS_ITEM_CLASS(sp_ctrlline_parent_class)->update(item, affine, flags);
}
sp_canvas_item_reset_bounds(item);
diff --git a/src/display/sp-ctrlline.h b/src/display/sp-ctrlline.h
index 12be03ca5..b2e222437 100644
--- a/src/display/sp-ctrlline.h
+++ b/src/display/sp-ctrlline.h
@@ -20,13 +20,11 @@
class SPItem;
-#define SP_TYPE_CTRLLINE (SPCtrlLine::getType())
+#define SP_TYPE_CTRLLINE (sp_ctrlline_get_type())
#define SP_CTRLLINE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), SP_TYPE_CTRLLINE, SPCtrlLine))
#define SP_IS_CTRLLINE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), SP_TYPE_CTRLLINE))
struct SPCtrlLine : public SPCanvasItem {
- static GType getType();
-
void setRgba32(guint32 rgba);
void setCoords(gdouble x0, gdouble y0, gdouble x1, gdouble y1);
@@ -41,6 +39,8 @@ struct SPCtrlLine : public SPCanvasItem {
Geom::Affine affine;
};
+GType sp_ctrlline_get_type();
+
struct SPCtrlLineClass : public SPCanvasItemClass{};
diff --git a/src/display/sp-ctrlpoint.cpp b/src/display/sp-ctrlpoint.cpp
index 026cc7589..1082cb1b3 100644
--- a/src/display/sp-ctrlpoint.cpp
+++ b/src/display/sp-ctrlpoint.cpp
@@ -20,42 +20,17 @@
#include "display/cairo-utils.h"
#include "display/sp-canvas.h"
-
-static void sp_ctrlpoint_class_init (SPCtrlPointClass *klass);
-static void sp_ctrlpoint_init (SPCtrlPoint *ctrlpoint);
static void sp_ctrlpoint_destroy(SPCanvasItem *object);
static void sp_ctrlpoint_update (SPCanvasItem *item, Geom::Affine const &affine, unsigned int flags);
static void sp_ctrlpoint_render (SPCanvasItem *item, SPCanvasBuf *buf);
-static SPCanvasItemClass *parent_class;
-
-GType
-sp_ctrlpoint_get_type (void)
-{
- static GType type = 0;
- if (!type) {
- GTypeInfo info = {
- sizeof(SPCtrlPointClass),
- NULL, NULL,
- (GClassInitFunc) sp_ctrlpoint_class_init,
- NULL, NULL,
- sizeof(SPCtrlPoint),
- 0,
- (GInstanceInitFunc) sp_ctrlpoint_init,
- NULL
- };
- type = g_type_register_static(SP_TYPE_CANVAS_ITEM, "SPCtrlPoint", &info, (GTypeFlags)0);
- }
- return type;
-}
+G_DEFINE_TYPE(SPCtrlPoint, sp_ctrlpoint, SP_TYPE_CANVAS_ITEM);
static void sp_ctrlpoint_class_init(SPCtrlPointClass *klass)
{
SPCanvasItemClass *item_class = SP_CANVAS_ITEM_CLASS(klass);
- parent_class = SP_CANVAS_ITEM_CLASS(g_type_class_peek_parent(klass));
-
item_class->destroy = sp_ctrlpoint_destroy;
item_class->update = sp_ctrlpoint_update;
item_class->render = sp_ctrlpoint_render;
@@ -79,8 +54,8 @@ static void sp_ctrlpoint_destroy(SPCanvasItem *object)
ctrlpoint->item=NULL;
- if (SP_CANVAS_ITEM_CLASS(parent_class)->destroy)
- (* SP_CANVAS_ITEM_CLASS(parent_class)->destroy) (object);
+ if (SP_CANVAS_ITEM_CLASS(sp_ctrlpoint_parent_class)->destroy)
+ SP_CANVAS_ITEM_CLASS(sp_ctrlpoint_parent_class)->destroy(object);
}
static void
@@ -111,8 +86,8 @@ static void sp_ctrlpoint_update(SPCanvasItem *item, Geom::Affine const &affine,
item->canvas->requestRedraw((int)item->x1, (int)item->y1, (int)item->x2, (int)item->y2);
- if (parent_class->update) {
- (* parent_class->update) (item, affine, flags);
+ if (SP_CANVAS_ITEM_CLASS(sp_ctrlpoint_parent_class)->update) {
+ SP_CANVAS_ITEM_CLASS(sp_ctrlpoint_parent_class)->update(item, affine, flags);
}
sp_canvas_item_reset_bounds (item);
diff --git a/src/display/sp-ctrlquadr.cpp b/src/display/sp-ctrlquadr.cpp
index b6a0da109..760e93a6d 100644
--- a/src/display/sp-ctrlquadr.cpp
+++ b/src/display/sp-ctrlquadr.cpp
@@ -29,42 +29,18 @@ struct SPCtrlQuadr : public SPCanvasItem{
struct SPCtrlQuadrClass : public SPCanvasItemClass{};
-static void sp_ctrlquadr_class_init (SPCtrlQuadrClass *klass);
-static void sp_ctrlquadr_init (SPCtrlQuadr *ctrlquadr);
static void sp_ctrlquadr_destroy(SPCanvasItem *object);
static void sp_ctrlquadr_update (SPCanvasItem *item, Geom::Affine const &affine, unsigned int flags);
static void sp_ctrlquadr_render (SPCanvasItem *item, SPCanvasBuf *buf);
-static SPCanvasItemClass *parent_class;
-
-GType
-sp_ctrlquadr_get_type (void)
-{
- static GType type = 0;
- if (!type) {
- GTypeInfo info = {
- sizeof(SPCtrlQuadrClass),
- NULL, NULL,
- (GClassInitFunc) sp_ctrlquadr_class_init,
- NULL, NULL,
- sizeof(SPCtrlQuadr),
- 0,
- (GInstanceInitFunc) sp_ctrlquadr_init,
- NULL
- };
- type = g_type_register_static(SP_TYPE_CANVAS_ITEM, "SPCtrlQuadr", &info, (GTypeFlags)0);
- }
- return type;
-}
+G_DEFINE_TYPE(SPCtrlQuadr, sp_ctrlquadr, SP_TYPE_CANVAS_ITEM);
static void
sp_ctrlquadr_class_init (SPCtrlQuadrClass *klass)
{
SPCanvasItemClass *item_class = SP_CANVAS_ITEM_CLASS(klass);
- parent_class = SP_CANVAS_ITEM_CLASS(g_type_class_peek_parent(klass));
-
item_class->destroy = sp_ctrlquadr_destroy;
item_class->update = sp_ctrlquadr_update;
item_class->render = sp_ctrlquadr_render;
@@ -85,8 +61,8 @@ static void sp_ctrlquadr_destroy(SPCanvasItem *object)
g_return_if_fail (object != NULL);
g_return_if_fail (SP_IS_CTRLQUADR (object));
- if (SP_CANVAS_ITEM_CLASS(parent_class)->destroy)
- (* SP_CANVAS_ITEM_CLASS(parent_class)->destroy) (object);
+ if (SP_CANVAS_ITEM_CLASS(sp_ctrlquadr_parent_class)->destroy)
+ (* SP_CANVAS_ITEM_CLASS(sp_ctrlquadr_parent_class)->destroy) (object);
}
static void
@@ -139,8 +115,8 @@ static void sp_ctrlquadr_update(SPCanvasItem *item, Geom::Affine const &affine,
item->canvas->requestRedraw((int)item->x1, (int)item->y1, (int)item->x2, (int)item->y2);
- if (parent_class->update) {
- (* parent_class->update)(item, affine, flags);
+ if (SP_CANVAS_ITEM_CLASS(sp_ctrlquadr_parent_class)->update) {
+ SP_CANVAS_ITEM_CLASS(sp_ctrlquadr_parent_class)->update(item, affine, flags);
}
sp_canvas_item_reset_bounds (item);
diff --git a/src/document-private.h b/src/document-private.h
index 4560aa28f..8e28b288b 100644
--- a/src/document-private.h
+++ b/src/document-private.h
@@ -34,6 +34,7 @@ class Event;
}
}
+typedef struct _GHashTable GHashTable;
struct SPDocumentPrivate {
typedef std::map<GQuark, SPDocument::IDChangedSignal> IDChangedSignalMap;
diff --git a/src/document-undo.cpp b/src/document-undo.cpp
index 8d3232738..15d5d2c70 100644
--- a/src/document-undo.cpp
+++ b/src/document-undo.cpp
@@ -44,19 +44,6 @@
* (Lauris Kaplinski)
*/
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif
-
-
-
-#if HAVE_STRING_H
-#endif
-
-
-#if HAVE_STDLIB_H
-#endif
-
#include <string>
#include <cstring>
#include "xml/repr.h"
@@ -112,7 +99,7 @@ void Inkscape::DocumentUndo::done(SPDocument *doc, const unsigned int event_type
maybeDone(doc, NULL, event_type, event_description);
}
-void Inkscape::DocumentUndo::resetKey( Inkscape::Application * /*inkscape*/, SPDesktop * /*desktop*/, GObject *base )
+void Inkscape::DocumentUndo::resetKey( InkscapeApplication * /*inkscape*/, SPDesktop * /*desktop*/, GObject *base )
{
SPDocument *doc = reinterpret_cast<SPDocument *>(base);
doc->actionkey.clear();
diff --git a/src/document-undo.h b/src/document-undo.h
index 38e575a34..17b3de252 100644
--- a/src/document-undo.h
+++ b/src/document-undo.h
@@ -9,11 +9,10 @@ typedef struct _GObject GObject;
class SPDesktop;
class SPDocument;
+struct InkscapeApplication;
namespace Inkscape {
-struct Application;
-
class DocumentUndo
{
public:
@@ -42,7 +41,7 @@ public:
static void maybeDone(SPDocument *document, const gchar *keyconst, unsigned int event_type, Glib::ustring const &event_description);
- static void resetKey(Inkscape::Application *inkscape, SPDesktop *desktop, GObject *base);
+ static void resetKey(InkscapeApplication *inkscape, SPDesktop *desktop, GObject *base);
static void cancel(SPDocument *document);
diff --git a/src/document.cpp b/src/document.cpp
index 8c5b25db7..e5b827937 100644
--- a/src/document.cpp
+++ b/src/document.cpp
@@ -1374,7 +1374,7 @@ GSList *SPDocument::getItemsAtPoints(unsigned const key, std::vector<Geom::Point
}
SPItem *SPDocument::getItemAtPoint( unsigned const key, Geom::Point const &p,
- gboolean const into_groups, SPItem *upto) const
+ bool const into_groups, SPItem *upto) const
{
g_return_val_if_fail(this->priv != NULL, NULL);
diff --git a/src/document.h b/src/document.h
index ee903449d..4ace249ae 100644
--- a/src/document.h
+++ b/src/document.h
@@ -75,8 +75,8 @@ class SPDocument : public Inkscape::GC::Managed<>,
public:
typedef sigc::signal<void, SPObject *> IDChangedSignal;
typedef sigc::signal<void> ResourcesChangedSignal;
- typedef sigc::signal<void, guint> ModifiedSignal;
- typedef sigc::signal<void, gchar const *> URISetSignal;
+ typedef sigc::signal<void, unsigned> ModifiedSignal;
+ typedef sigc::signal<void, char const *> URISetSignal;
typedef sigc::signal<void, double, double> ResizedSignal;
typedef sigc::signal<void> ReconstructionStart;
typedef sigc::signal<void> ReconstructionFinish;
@@ -100,9 +100,9 @@ public:
CRCascade *style_cascade;
protected:
- gchar *uri; ///< A filename (not a URI yet), or NULL
- gchar *base; ///< To be used for resolving relative hrefs.
- gchar *name; ///< basename(uri) or other human-readable label for the document.
+ char *uri; ///< A filename (not a URI yet), or NULL
+ char *base; ///< To be used for resolving relative hrefs.
+ char *name; ///< basename(uri) or other human-readable label for the document.
public:
@@ -112,10 +112,10 @@ public:
Glib::ustring actionkey;
/// Handler ID
- guint modified_id;
+ unsigned modified_id;
/// Connector rerouting handler ID
- guint rerouting_handler_id;
+ unsigned rerouting_handler_id;
Inkscape::ProfileManager* profileManager;
@@ -137,15 +137,15 @@ public:
Inkscape::XML::Document const *getReprDoc() const { return rdoc; }
/** A filename (not a URI yet), or NULL */
- gchar const *getURI() const { return uri; }
- void setUri(gchar const *uri);
+ char const *getURI() const { return uri; }
+ void setUri(char const *uri);
/** To be used for resolving relative hrefs. */
- gchar const *getBase() const { return base; };
- void setBase( gchar const* base );
+ char const *getBase() const { return base; };
+ void setBase( char const* base );
/** basename(uri) or other human-readable label for the document. */
- gchar const* getName() const { return name; }
+ char const* getName() const { return name; }
/** Return the main defs object for the document. */
SPDefs *getDefs();
@@ -173,10 +173,10 @@ public:
sigc::connection connectResized(ResizedSignal::slot_type slot);
sigc::connection connectCommit(CommitSignal::slot_type slot);
- void bindObjectToId(gchar const *id, SPObject *object);
+ void bindObjectToId(char const *id, SPObject *object);
SPObject *getObjectById(Glib::ustring const &id) const;
- SPObject *getObjectById(gchar const *id) const;
- sigc::connection connectIdChanged(const gchar *id, IDChangedSignal::slot_type slot);
+ SPObject *getObjectById(char const *id) const;
+ sigc::connection connectIdChanged(const char *id, IDChangedSignal::slot_type slot);
void bindObjectToRepr(Inkscape::XML::Node *repr, SPObject *object);
SPObject *getObjectByRepr(Inkscape::XML::Node *repr) const;
@@ -222,12 +222,12 @@ public:
sigc::connection _selection_changed_connection;
sigc::connection _desktop_activated_connection;
- sigc::connection connectResourcesChanged(const gchar *key, SPDocument::ResourcesChangedSignal::slot_type slot);
+ sigc::connection connectResourcesChanged(char const *key, SPDocument::ResourcesChangedSignal::slot_type slot);
void fitToRect(Geom::Rect const &rect, bool with_margins = false);
- static SPDocument *createNewDoc(const gchar *uri, unsigned int keepalive,
+ static SPDocument *createNewDoc(char const*uri, unsigned int keepalive,
bool make_new = false, SPDocument *parent=NULL );
- static SPDocument *createNewDocFromMem(const gchar *buffer, gint length, unsigned int keepalive);
+ static SPDocument *createNewDocFromMem(char const*buffer, int length, unsigned int keepalive);
SPDocument *createChildDoc(std::string const &uri);
/**
@@ -235,8 +235,8 @@ public:
*/
static SPItem *getItemFromListAtPointBottom(unsigned int dkey, SPGroup *group, const GSList *list, Geom::Point const &p, bool take_insensitive = false);
- static SPDocument *createDoc(Inkscape::XML::Document *rdoc, gchar const *uri,
- gchar const *base, gchar const *name, unsigned int keepalive,
+ static SPDocument *createDoc(Inkscape::XML::Document *rdoc, char const *uri,
+ char const *base, char const *name, unsigned int keepalive,
SPDocument *parent);
SPDocument *doRef();
@@ -250,25 +250,25 @@ public:
void setHeight(const Inkscape::Util::Quantity &height);
void setViewBox(const Geom::Rect &viewBox);
void requestModified();
- gint ensureUpToDate();
- bool addResource(const gchar *key, SPObject *object);
- bool removeResource(const gchar *key, SPObject *object);
- const GSList *getResourceList(const gchar *key) const;
+ int ensureUpToDate();
+ bool addResource(char const *key, SPObject *object);
+ bool removeResource(char const *key, SPObject *object);
+ const GSList *getResourceList(char const *key) const;
GSList *getItemsInBox(unsigned int dkey, Geom::Rect const &box) const;
GSList *getItemsPartiallyInBox(unsigned int dkey, Geom::Rect const &box) const;
- SPItem *getItemAtPoint(unsigned int key, Geom::Point const &p, gboolean into_groups, SPItem *upto = NULL) const;
+ SPItem *getItemAtPoint(unsigned int key, Geom::Point const &p, bool into_groups, SPItem *upto = NULL) const;
GSList *getItemsAtPoints(unsigned const key, std::vector<Geom::Point> points) const;
SPItem *getGroupAtPoint(unsigned int key, Geom::Point const &p) const;
- void changeUriAndHrefs(gchar const *uri);
- void emitResizedSignal(gdouble width, gdouble height);
+ void changeUriAndHrefs(char const *uri);
+ void emitResizedSignal(double width, double height);
unsigned int vacuumDocument();
void importDefs(SPDocument *source);
private:
- void do_change_uri(gchar const *const filename, bool const rebase);
+ void do_change_uri(char const *const filename, bool const rebase);
void setupViewport(SPItemCtx *ctx);
};
diff --git a/src/ege-color-prof-tracker.cpp b/src/ege-color-prof-tracker.cpp
index eca90ecb7..78ee6b8b5 100644
--- a/src/ege-color-prof-tracker.cpp
+++ b/src/ege-color-prof-tracker.cpp
@@ -273,8 +273,13 @@ void ege_color_prof_tracker_get_profile_for( guint screenNum, guint monitor, gpo
gpointer dataPos = 0;
guint dataLen = 0;
GdkDisplay* display = gdk_display_get_default();
+
+#if GTK_CHECK_VERSION(3,10,0)
+ GdkScreen* screen = (screenNum < 1) ? gdk_display_get_screen(display, screenNum) : 0;
+#else
gint numScreens = gdk_display_get_n_screens(display);
GdkScreen* screen = (screenNum < (guint)numScreens) ? gdk_display_get_screen(display, screenNum) : 0;
+#endif
if ( screen ) {
GSList* curr = tracked_screens;
@@ -494,7 +499,11 @@ GdkFilterReturn x11_win_filter(GdkXEvent *xevent,
if ( stat ) {
GdkDisplay* display = gdk_x11_lookup_xdisplay(native->xproperty.display);
if ( display ) {
+#if GTK_CHECK_VERSION(3,10,0)
+ gint screenCount = 1;
+#else
gint screenCount = gdk_display_get_n_screens(display);
+#endif
GdkScreen* targetScreen = 0;
gint i = 0;
for ( i = 0; i < screenCount; i++ ) {
diff --git a/src/event-log.h b/src/event-log.h
index 7e3ba6817..6d4112a5a 100644
--- a/src/event-log.h
+++ b/src/event-log.h
@@ -11,14 +11,6 @@
#ifndef INKSCAPE_EVENT_LOG_H
#define INKSCAPE_EVENT_LOG_H
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif
-
-#if GLIBMM_DISABLE_DEPRECATED && HAVE_GLIBMM_THREADS_H
-#include <glibmm/threads.h>
-#endif
-
#include <gtkmm/treestore.h>
#include <glibmm/refptr.h>
#include <gtkmm/treeselection.h>
diff --git a/src/extension/implementation/script.cpp b/src/extension/implementation/script.cpp
index f9241b1b7..99c882a01 100644
--- a/src/extension/implementation/script.cpp
+++ b/src/extension/implementation/script.cpp
@@ -26,7 +26,7 @@
#include "desktop-handles.h"
#include "desktop.h"
-#include "dialogs/dialog-events.h"
+#include "ui/dialog-events.h"
#include "extension/effect.h"
#include "extension/output.h"
#include "extension/input.h"
diff --git a/src/extension/implementation/script.h b/src/extension/implementation/script.h
index 270c361af..6a7d0c3b8 100644
--- a/src/extension/implementation/script.h
+++ b/src/extension/implementation/script.h
@@ -22,81 +22,30 @@
namespace Inkscape {
namespace XML {
class Node;
-}
-}
+} // namespace XML
-
-namespace Inkscape {
namespace Extension {
namespace Implementation {
-
/**
* Utility class used for loading and launching script extensions
*/
class Script : public Implementation {
-
public:
- /**
- *
- */
Script(void);
-
- /**
- *
- */
virtual ~Script();
-
-
- /**
- *
- */
virtual bool load(Inkscape::Extension::Extension *module);
-
- /**
- *
- */
virtual void unload(Inkscape::Extension::Extension *module);
-
- /**
- *
- */
virtual bool check(Inkscape::Extension::Extension *module);
ImplementationDocumentCache * newDocCache(Inkscape::Extension::Extension * ext, Inkscape::UI::View::View * view);
- /**
- *
- */
- virtual Gtk::Widget *prefs_input(Inkscape::Extension::Input *module,
- gchar const *filename);
-
- /**
- *
- */
- virtual SPDocument *open(Inkscape::Extension::Input *module,
- gchar const *filename);
-
- /**
- *
- */
+ virtual Gtk::Widget *prefs_input(Inkscape::Extension::Input *module, gchar const *filename);
+ virtual SPDocument *open(Inkscape::Extension::Input *module, gchar const *filename);
virtual Gtk::Widget *prefs_output(Inkscape::Extension::Output *module);
-
- /**
- *
- */
- virtual void save(Inkscape::Extension::Output *module,
- SPDocument *doc,
- gchar const *filename);
-
- /**
- *
- */
- virtual void effect(Inkscape::Extension::Effect *module,
- Inkscape::UI::View::View *doc,
- ImplementationDocumentCache * docCache);
-
+ virtual void save(Inkscape::Extension::Output *module, SPDocument *doc, gchar const *filename);
+ virtual void effect(Inkscape::Extension::Effect *module, Inkscape::UI::View::View *doc, ImplementationDocumentCache * docCache);
virtual bool cancelProcessing (void);
private:
@@ -105,7 +54,7 @@ private:
Glib::RefPtr<Glib::MainLoop> _main_loop;
/**
- * The command that has been dirived from
+ * The command that has been derived from
* the configuration file with appropriate directories
*/
std::list<std::string> command;
@@ -117,13 +66,10 @@ private:
*/
Glib::ustring helper_extension;
- std::string solve_reldir (Inkscape::XML::Node *reprin);
- bool check_existence (const std::string &command);
- void copy_doc (Inkscape::XML::Node * olddoc,
- Inkscape::XML::Node * newdoc);
- void checkStderr (const Glib::ustring &filename,
- Gtk::MessageType type,
- const Glib::ustring &message);
+ std::string solve_reldir(Inkscape::XML::Node *repr_in);
+ bool check_existence (std::string const& command);
+ void copy_doc(Inkscape::XML::Node * olddoc, Inkscape::XML::Node * newdoc);
+ void checkStderr (Glib::ustring const& filename, Gtk::MessageType type, Glib::ustring const& message);
class file_listener {
Glib::ustring _string;
@@ -140,6 +86,7 @@ private:
bool isDead () { return _dead; }
+ // TODO move these definitions into script.cpp
void init (int fd, Glib::RefPtr<Glib::MainLoop> main) {
_channel = Glib::IOChannel::create_from_fd(fd);
_channel->set_encoding();
@@ -202,11 +149,6 @@ private:
std::string resolveInterpreterExecutable(const Glib::ustring &interpNameArg);
}; // class Script
-
-
-
-
-
} // namespace Implementation
} // namespace Extension
} // namespace Inkscape
diff --git a/src/extension/input.h b/src/extension/input.h
index b01ffeb86..2a0a177a0 100644
--- a/src/extension/input.h
+++ b/src/extension/input.h
@@ -14,9 +14,8 @@
#include <exception>
#include <glib.h>
#include "extension.h"
-#include "xml/repr.h"
-#include "document.h"
-#include <gtk/gtk.h>
+
+class SPDocument;
namespace Inkscape {
namespace Extension {
diff --git a/src/extension/internal/cairo-render-context.h b/src/extension/internal/cairo-render-context.h
index 59781a49c..57d155b60 100644
--- a/src/extension/internal/cairo-render-context.h
+++ b/src/extension/internal/cairo-render-context.h
@@ -31,6 +31,9 @@
class SPClipPath;
class SPMask;
+typedef struct _PangoFont PangoFont;
+typedef struct _PangoLayout PangoLayout;
+
namespace Inkscape {
class Pixbuf;
diff --git a/src/extension/internal/cairo-renderer.cpp b/src/extension/internal/cairo-renderer.cpp
index 367bfadbf..a725685d4 100644
--- a/src/extension/internal/cairo-renderer.cpp
+++ b/src/extension/internal/cairo-renderer.cpp
@@ -42,7 +42,7 @@
#include "sp-item.h"
#include "sp-item-group.h"
#include "style.h"
-#include "marker.h"
+#include "sp-marker.h"
#include "sp-linear-gradient.h"
#include "sp-radial-gradient.h"
#include "sp-root.h"
diff --git a/src/extension/internal/cdr-input.cpp b/src/extension/internal/cdr-input.cpp
index 748bf4477..3a3e2b58e 100644
--- a/src/extension/internal/cdr-input.cpp
+++ b/src/extension/internal/cdr-input.cpp
@@ -54,7 +54,7 @@
#include "document-undo.h"
#include "inkscape.h"
-#include "dialogs/dialog-events.h"
+#include "ui/dialog-events.h"
#include <gtk/gtk.h>
#include "ui/widget/spinbutton.h"
#include "ui/widget/frame.h"
@@ -153,9 +153,15 @@ CdrImportDialog::CdrImportDialog(const std::vector<RVNGString> &vec)
_labelTotalPages->set_use_markup(false);
_labelTotalPages->set_selectable(false);
vbox2->pack_start(*_previewArea, Gtk::PACK_SHRINK, 0);
+#if WITH_GTKMM_3_0
+ this->get_content_area()->set_homogeneous(false);
+ this->get_content_area()->set_spacing(0);
+ this->get_content_area()->pack_start(*vbox2);
+#else
this->get_vbox()->set_homogeneous(false);
this->get_vbox()->set_spacing(0);
this->get_vbox()->pack_start(*vbox2);
+#endif
this->set_title(_("Page Selector"));
this->set_modal(true);
sp_transientize(GTK_WIDGET(this->gobj())); //Make transient
diff --git a/src/extension/internal/emf-inout.cpp b/src/extension/internal/emf-inout.cpp
index ee5e76969..4b070cbaa 100644
--- a/src/extension/internal/emf-inout.cpp
+++ b/src/extension/internal/emf-inout.cpp
@@ -27,12 +27,12 @@
# include "config.h"
#endif
-//#include <png.h> //This must precede text_reassemble.h or it blows up in pngconf.h when compiling
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <libuemf/symbol_convert.h>
+#include "document.h"
#include "sp-root.h" // even though it is included indirectly by wmf-inout.h
#include "sp-path.h"
#include "print.h"
diff --git a/src/extension/internal/gdkpixbuf-input.cpp b/src/extension/internal/gdkpixbuf-input.cpp
index a384c7bde..28e44c461 100644
--- a/src/extension/internal/gdkpixbuf-input.cpp
+++ b/src/extension/internal/gdkpixbuf-input.cpp
@@ -1,21 +1,20 @@
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
+#include <gdk-pixbuf/gdk-pixbuf.h>
+
#include <boost/scoped_ptr.hpp>
#include <glib/gprintf.h>
#include <glibmm/i18n.h>
+#include "dir-util.h"
+#include "display/cairo-utils.h"
#include "document-private.h"
-#include <dir-util.h>
+#include "document-undo.h"
#include "extension/input.h"
#include "extension/system.h"
+#include "image-resolution.h"
#include "gdkpixbuf-input.h"
#include "preferences.h"
#include "selection-chemistry.h"
#include "sp-image.h"
-#include "document-undo.h"
#include "util/units.h"
-#include "image-resolution.h"
-#include "display/cairo-utils.h"
#include <set>
namespace Inkscape {
@@ -87,11 +86,11 @@ GdkpixbufInput::open(Inkscape::Extension::Input *mod, char const *uri)
ir = new ImageResolution(uri);
}
if (ir && ir->ok()) {
- xscale = 900.0 / floor(10.*ir->x() + .5); // round-off to 0.1 dpi
- yscale = 900.0 / floor(10.*ir->y() + .5);
+ xscale = 960.0 / floor(10.*ir->x() + .5); // round-off to 0.1 dpi
+ yscale = 960.0 / floor(10.*ir->y() + .5);
} else {
- xscale = 90.0 / defaultxdpi;
- yscale = 90.0 / defaultxdpi;
+ xscale = 96.0 / defaultxdpi;
+ yscale = 96.0 / defaultxdpi;
}
width *= xscale;
diff --git a/src/extension/internal/gdkpixbuf-input.h b/src/extension/internal/gdkpixbuf-input.h
index 597e7246b..2e03a96db 100644
--- a/src/extension/internal/gdkpixbuf-input.h
+++ b/src/extension/internal/gdkpixbuf-input.h
@@ -10,7 +10,7 @@ namespace Internal {
class GdkpixbufInput : Inkscape::Extension::Implementation::Implementation {
public:
SPDocument *open(Inkscape::Extension::Input *mod,
- gchar const *uri);
+ char const *uri);
static void init();
};
diff --git a/src/extension/internal/metafile-inout.cpp b/src/extension/internal/metafile-inout.cpp
index 28e9932b3..824934b3e 100644
--- a/src/extension/internal/metafile-inout.cpp
+++ b/src/extension/internal/metafile-inout.cpp
@@ -30,7 +30,7 @@
#include "style.h"
#include "document.h"
#include "util/units.h"
-#include "shape-editor.h"
+#include "ui/shape-editor.h"
#include "sp-namedview.h"
#include "document-undo.h"
#include "inkscape.h"
@@ -202,7 +202,7 @@ void Metafile::setViewBoxIfMissing(SPDocument *doc) {
// Scale and translate objects
double scale = Inkscape::Util::Quantity::convert(1, "px", doc_unit);
- ShapeEditor::blockSetItem(true);
+ Inkscape::UI::ShapeEditor::blockSetItem(true);
double dh;
if(SP_ACTIVE_DOCUMENT){ // for file menu open or import, or paste from clipboard
dh = SP_ACTIVE_DOCUMENT->getHeight().value("px");
@@ -223,7 +223,7 @@ void Metafile::setViewBoxIfMissing(SPDocument *doc) {
prefs->setBool("/options/transform/gradient", true);
doc->getRoot()->scaleChildItemsRec(Geom::Scale(scale), Geom::Point(0, dh), true);
- ShapeEditor::blockSetItem(false);
+ Inkscape::UI::ShapeEditor::blockSetItem(false);
// restore options
prefs->setBool("/options/transform/stroke", transform_stroke);
diff --git a/src/extension/internal/pdfinput/pdf-input.cpp b/src/extension/internal/pdfinput/pdf-input.cpp
index cbdaf9d20..c8a7feabf 100644
--- a/src/extension/internal/pdfinput/pdf-input.cpp
+++ b/src/extension/internal/pdfinput/pdf-input.cpp
@@ -48,7 +48,7 @@
#include "inkscape.h"
#include "util/units.h"
-#include "dialogs/dialog-events.h"
+#include "ui/dialog-events.h"
#include <gtk/gtk.h>
#include "ui/widget/spinbutton.h"
#include "ui/widget/frame.h"
diff --git a/src/extension/internal/vsd-input.cpp b/src/extension/internal/vsd-input.cpp
index 674997d54..9f9bf2651 100644
--- a/src/extension/internal/vsd-input.cpp
+++ b/src/extension/internal/vsd-input.cpp
@@ -56,7 +56,7 @@
#include "inkscape.h"
#include "util/units.h"
-#include "dialogs/dialog-events.h"
+#include "ui/dialog-events.h"
#include <gtk/gtk.h>
#include "ui/widget/spinbutton.h"
#include "ui/widget/frame.h"
@@ -153,9 +153,15 @@ VsdImportDialog::VsdImportDialog(const std::vector<RVNGString> &vec)
_labelTotalPages->set_use_markup(false);
_labelTotalPages->set_selectable(false);
vbox2->pack_start(*_previewArea, Gtk::PACK_SHRINK, 0);
+#if WITH_GTKMM_3_0
+ this->get_content_area()->set_homogeneous(false);
+ this->get_content_area()->set_spacing(0);
+ this->get_content_area()->pack_start(*vbox2);
+#else
this->get_vbox()->set_homogeneous(false);
this->get_vbox()->set_spacing(0);
this->get_vbox()->pack_start(*vbox2);
+#endif
this->set_title(_("Page Selector"));
this->set_modal(true);
sp_transientize(GTK_WIDGET(this->gobj())); //Make transient
diff --git a/src/extension/internal/wmf-inout.cpp b/src/extension/internal/wmf-inout.cpp
index 44d73ee8d..72c1c8bd3 100644
--- a/src/extension/internal/wmf-inout.cpp
+++ b/src/extension/internal/wmf-inout.cpp
@@ -33,6 +33,7 @@
#include <stdint.h>
#include <libuemf/symbol_convert.h>
+#include "document.h"
#include "sp-root.h" // even though it is included indirectly by wmf-inout.h
#include "sp-path.h"
#include "print.h"
diff --git a/src/extension/output.h b/src/extension/output.h
index c5b1beb45..44a731ca0 100644
--- a/src/extension/output.h
+++ b/src/extension/output.h
@@ -13,7 +13,6 @@
#ifndef INKSCAPE_EXTENSION_OUTPUT_H__
#define INKSCAPE_EXTENSION_OUTPUT_H__
-#include <gtk/gtk.h>
#include "extension.h"
class SPDocument;
diff --git a/src/extension/prefdialog.cpp b/src/extension/prefdialog.cpp
index 3a384257c..0ea15a5cd 100644
--- a/src/extension/prefdialog.cpp
+++ b/src/extension/prefdialog.cpp
@@ -13,7 +13,7 @@
#include <gtkmm/separator.h>
#include <glibmm/i18n.h>
-#include "../dialogs/dialog-events.h"
+#include "ui/dialog-events.h"
#include "xml/repr.h"
// Used to get SP_ACTIVE_DESKTOP
diff --git a/src/extension/system.cpp b/src/extension/system.cpp
index 45feb882f..5225f11ee 100644
--- a/src/extension/system.cpp
+++ b/src/extension/system.cpp
@@ -20,7 +20,7 @@
# include <config.h>
#endif
-#include <interface.h>
+#include "ui/interface.h"
#include <unistd.h>
#include <glibmm/miscutils.h>
diff --git a/src/extract-uri.h b/src/extract-uri.h
index a6707f1a1..e9ee0b1d8 100644
--- a/src/extract-uri.h
+++ b/src/extract-uri.h
@@ -1,9 +1,7 @@
#ifndef SEEN_EXTRACT_URI_H
#define SEEN_EXTRACT_URI_H
-#include <glib.h>
-
-gchar *extract_uri(gchar const *s, gchar const** endptr = 0);
+char *extract_uri(char const *s, char const** endptr = 0);
#endif /* !SEEN_EXTRACT_URI_H */
diff --git a/src/factory.h b/src/factory.h
index c76501cfd..c1288b460 100644
--- a/src/factory.h
+++ b/src/factory.h
@@ -91,7 +91,7 @@ struct NodeTraits {
break;
case Inkscape::XML::ELEMENT_NODE: {
- gchar const *const sptype = node.attribute("sodipodi:type");
+ char const *const sptype = node.attribute("sodipodi:type");
if (sptype) {
name = sptype;
diff --git a/src/file.cpp b/src/file.cpp
index 200077de5..307944001 100644
--- a/src/file.cpp
+++ b/src/file.cpp
@@ -46,7 +46,7 @@
#include "id-clash.h"
#include "inkscape.h"
#include "inkscape.h"
-#include "interface.h"
+#include "ui/interface.h"
#include "io/sys.h"
#include "message.h"
#include "message-stack.h"
@@ -671,7 +671,7 @@ file_save(Gtk::Window &parentWindow, SPDocument *doc, const Glib::ustring &uri,
sp_ui_error_dialog(text);
g_free(text);
g_free(safeUri);
- return FALSE;
+ return false;
} catch (Inkscape::Extension::Output::file_read_only &e) {
gchar *safeUri = Inkscape::IO::sanitizeString(uri.c_str());
gchar *text = g_strdup_printf(_("File %s is write protected. Please remove write protection and try again."), safeUri);
@@ -679,7 +679,7 @@ file_save(Gtk::Window &parentWindow, SPDocument *doc, const Glib::ustring &uri,
sp_ui_error_dialog(text);
g_free(text);
g_free(safeUri);
- return FALSE;
+ return false;
} catch (Inkscape::Extension::Output::save_failed &e) {
gchar *safeUri = Inkscape::IO::sanitizeString(uri.c_str());
gchar *text = g_strdup_printf(_("File %s could not be saved."), safeUri);
@@ -687,15 +687,15 @@ file_save(Gtk::Window &parentWindow, SPDocument *doc, const Glib::ustring &uri,
sp_ui_error_dialog(text);
g_free(text);
g_free(safeUri);
- return FALSE;
+ return false;
} catch (Inkscape::Extension::Output::save_cancelled &e) {
SP_ACTIVE_DESKTOP->messageStack()->flash(Inkscape::ERROR_MESSAGE, _("Document not saved."));
- return FALSE;
+ return false;
} catch (Inkscape::Extension::Output::no_overwrite &e) {
return sp_file_save_dialog(parentWindow, doc, save_method);
} catch (...) {
SP_ACTIVE_DESKTOP->messageStack()->flash(Inkscape::ERROR_MESSAGE, _("Document not saved."));
- return FALSE;
+ return false;
}
if (SP_ACTIVE_DESKTOP) {
diff --git a/src/file.h b/src/file.h
index 7f80f3645..4ffbc8ec0 100644
--- a/src/file.h
+++ b/src/file.h
@@ -75,7 +75,7 @@ bool sp_file_open(
* Displays a file open dialog. Calls sp_file_open on
* an OK.
*/
-void sp_file_open_dialog (Gtk::Window &parentWindow, gpointer object, gpointer data);
+void sp_file_open_dialog (Gtk::Window &parentWindow, void* object, void* data);
/**
* Reverts file to disk-copy on "YES"
@@ -96,19 +96,19 @@ bool file_save_remote(SPDocument *doc, const Glib::ustring &uri,
/**
*
*/
-bool sp_file_save (Gtk::Window &parentWindow, gpointer object, gpointer data);
+bool sp_file_save (Gtk::Window &parentWindow, void* object, void* data);
/**
* Saves the given document. Displays a file select dialog
* to choose the new name.
*/
-bool sp_file_save_as (Gtk::Window &parentWindow, gpointer object, gpointer data);
+bool sp_file_save_as (Gtk::Window &parentWindow, void* object, void* data);
/**
* Saves a copy of the given document. Displays a file select dialog
* to choose a name for the copy.
*/
-bool sp_file_save_a_copy (Gtk::Window &parentWindow, gpointer object, gpointer data);
+bool sp_file_save_a_copy (Gtk::Window &parentWindow, void* object, void* data);
/**
diff --git a/src/filter-chemistry.cpp b/src/filter-chemistry.cpp
index 151480177..9298a1ffc 100644
--- a/src/filter-chemistry.cpp
+++ b/src/filter-chemistry.cpp
@@ -15,6 +15,8 @@
#include <cstring>
+#include <glibmm.h>
+
#include "style.h"
#include "document-private.h"
#include "desktop-style.h"
diff --git a/src/filter-chemistry.h b/src/filter-chemistry.h
index 2ac3ebe8f..104016845 100644
--- a/src/filter-chemistry.h
+++ b/src/filter-chemistry.h
@@ -14,8 +14,6 @@
#ifndef SEEN_SP_FILTER_CHEMISTRY_H
#define SEEN_SP_FILTER_CHEMISTRY_H
-#include <glib.h>
-
#include "display/nr-filter-types.h"
class SPDocument;
@@ -24,12 +22,11 @@ class SPFilterPrimitive;
class SPItem;
class SPObject;
-
SPFilterPrimitive *filter_add_primitive(SPFilter *filter, Inkscape::Filters::FilterPrimitiveType);
SPFilter *new_filter (SPDocument *document);
-SPFilter *new_filter_gaussian_blur (SPDocument *document, gdouble stdDeviation, double expansion, double expansionX, double expansionY, double width, double height);
-SPFilter *new_filter_simple_from_item (SPDocument *document, SPItem *item, const char *mode, gdouble stdDeviation);
-SPFilter *modify_filter_gaussian_blur_from_item (SPDocument *document, SPItem *item, gdouble stdDeviation);
+SPFilter *new_filter_gaussian_blur (SPDocument *document, double stdDeviation, double expansion, double expansionX, double expansionY, double width, double height);
+SPFilter *new_filter_simple_from_item (SPDocument *document, SPItem *item, const char *mode, double stdDeviation);
+SPFilter *modify_filter_gaussian_blur_from_item (SPDocument *document, SPItem *item, double stdDeviation);
void remove_filter (SPObject *item, bool recursive);
void remove_filter_gaussian_blur (SPObject *item);
bool filter_is_single_gaussian_blur(SPFilter *filter);
diff --git a/src/filter-enums.cpp b/src/filter-enums.cpp
index 67ca7b6e7..ae11aa64f 100644
--- a/src/filter-enums.cpp
+++ b/src/filter-enums.cpp
@@ -9,6 +9,7 @@
* Released under GNU GPL, read the file 'COPYING' for more information
*/
+#include <glibmm.h>
#include <glibmm/i18n.h>
#include "filter-enums.h"
diff --git a/src/filters/distantlight.h b/src/filters/distantlight.h
index 0eebf768f..6490d987c 100644
--- a/src/filters/distantlight.h
+++ b/src/filters/distantlight.h
@@ -27,21 +27,21 @@ public:
virtual ~SPFeDistantLight();
/** azimuth attribute */
- gfloat azimuth;
- guint azimuth_set : 1;
+ float azimuth;
+ unsigned int azimuth_set : 1;
/** elevation attribute */
- gfloat elevation;
- guint elevation_set : 1;
+ float elevation;
+ unsigned int elevation_set : 1;
protected:
virtual void build(SPDocument* doc, Inkscape::XML::Node* repr);
virtual void release();
- virtual void set(unsigned int key, const gchar* value);
+ virtual void set(unsigned int key, char const* value);
virtual void update(SPCtx* ctx, unsigned int flags);
- virtual Inkscape::XML::Node* write(Inkscape::XML::Document* doc, Inkscape::XML::Node* repr, guint flags);
+ virtual Inkscape::XML::Node* write(Inkscape::XML::Document* doc, Inkscape::XML::Node* repr, unsigned int flags);
};
#endif /* !SP_FEDISTANTLIGHT_H_SEEN */
diff --git a/src/filters/pointlight.h b/src/filters/pointlight.h
index 3819d8ff5..1e26d45e7 100644
--- a/src/filters/pointlight.h
+++ b/src/filters/pointlight.h
@@ -26,24 +26,24 @@ public:
virtual ~SPFePointLight();
/** x coordinate of the light source */
- gfloat x;
- guint x_set : 1;
+ float x;
+ unsigned int x_set : 1;
/** y coordinate of the light source */
- gfloat y;
- guint y_set : 1;
+ float y;
+ unsigned int y_set : 1;
/** z coordinate of the light source */
- gfloat z;
- guint z_set : 1;
+ float z;
+ unsigned int z_set : 1;
protected:
virtual void build(SPDocument* doc, Inkscape::XML::Node* repr);
virtual void release();
- virtual void set(unsigned int key, const gchar* value);
+ virtual void set(unsigned int key, char const* value);
virtual void update(SPCtx* ctx, unsigned int flags);
- virtual Inkscape::XML::Node* write(Inkscape::XML::Document* doc, Inkscape::XML::Node* repr, guint flags);
+ virtual Inkscape::XML::Node* write(Inkscape::XML::Document* doc, Inkscape::XML::Node* repr, unsigned int flags);
};
#endif /* !SP_FEPOINTLIGHT_H_SEEN */
diff --git a/src/filters/spotlight.h b/src/filters/spotlight.h
index 8caf12858..7d5f6dd30 100644
--- a/src/filters/spotlight.h
+++ b/src/filters/spotlight.h
@@ -26,40 +26,40 @@ public:
virtual ~SPFeSpotLight();
/** x coordinate of the light source */
- gfloat x;
- guint x_set : 1;
+ float x;
+ unsigned int x_set : 1;
/** y coordinate of the light source */
- gfloat y;
- guint y_set : 1;
+ float y;
+ unsigned int y_set : 1;
/** z coordinate of the light source */
- gfloat z;
- guint z_set : 1;
+ float z;
+ unsigned int z_set : 1;
/** x coordinate of the point the source is pointing at */
- gfloat pointsAtX;
- guint pointsAtX_set : 1;
+ float pointsAtX;
+ unsigned int pointsAtX_set : 1;
/** y coordinate of the point the source is pointing at */
- gfloat pointsAtY;
- guint pointsAtY_set : 1;
+ float pointsAtY;
+ unsigned int pointsAtY_set : 1;
/** z coordinate of the point the source is pointing at */
- gfloat pointsAtZ;
- guint pointsAtZ_set : 1;
+ float pointsAtZ;
+ unsigned int pointsAtZ_set : 1;
/** specular exponent (focus of the light) */
- gfloat specularExponent;
- guint specularExponent_set : 1;
+ float specularExponent;
+ unsigned int specularExponent_set : 1;
/** limiting cone angle */
- gfloat limitingConeAngle;
- guint limitingConeAngle_set : 1;
+ float limitingConeAngle;
+ unsigned int limitingConeAngle_set : 1;
//other fields
protected:
virtual void build(SPDocument* doc, Inkscape::XML::Node* repr);
virtual void release();
- virtual void set(unsigned int key, const gchar* value);
+ virtual void set(unsigned int key, char const* value);
virtual void update(SPCtx* ctx, unsigned int flags);
- virtual Inkscape::XML::Node* write(Inkscape::XML::Document* doc, Inkscape::XML::Node* repr, guint flags);
+ virtual Inkscape::XML::Node* write(Inkscape::XML::Document* doc, Inkscape::XML::Node* repr, unsigned int flags);
};
#endif /* !SP_FESPOTLIGHT_H_SEEN */
diff --git a/src/gc-anchored.h b/src/gc-anchored.h
index a20904dce..99b78c784 100644
--- a/src/gc-anchored.h
+++ b/src/gc-anchored.h
@@ -9,7 +9,6 @@
#ifndef SEEN_INKSCAPE_GC_ANCHORED_H
#define SEEN_INKSCAPE_GC_ANCHORED_H
-#include <glib.h>
#include "gc-managed.h"
namespace Inkscape {
diff --git a/src/gc-core.h b/src/gc-core.h
index 3957bda1a..d9d0bf4ff 100644
--- a/src/gc-core.h
+++ b/src/gc-core.h
@@ -24,7 +24,6 @@
#else
# include <gc.h>
#endif
-#include <glib.h>
namespace Inkscape {
namespace GC {
diff --git a/src/gradient-chemistry.h b/src/gradient-chemistry.h
index 728874f88..792ccc72e 100644
--- a/src/gradient-chemistry.h
+++ b/src/gradient-chemistry.h
@@ -22,6 +22,7 @@
class SPCSSAttr;
class SPItem;
+typedef unsigned int guint32;
/**
* Either normalizes given gradient to vector, or returns fresh normalized
@@ -53,7 +54,7 @@ SPGradient *sp_gradient_vector_for_object( SPDocument *doc, SPDesktop *desktop,
void sp_object_ensure_fill_gradient_normalized (SPObject *object);
void sp_object_ensure_stroke_gradient_normalized (SPObject *object);
-SPGradient *sp_gradient_convert_to_userspace (SPGradient *gr, SPItem *item, const gchar *property);
+SPGradient *sp_gradient_convert_to_userspace (SPGradient *gr, SPItem *item, const char *property);
SPGradient *sp_gradient_reset_to_userspace (SPGradient *gr, SPItem *item);
SPGradient *sp_gradient_fork_vector_if_necessary (SPGradient *gr);
@@ -61,11 +62,11 @@ SPGradient *sp_gradient_get_forked_vector_if_necessary(SPGradient *gradient, boo
SPStop* sp_last_stop(SPGradient *gradient);
-SPStop* sp_get_stop_i(SPGradient *gradient, guint i);
-guint sp_number_of_stops(SPGradient const *gradient);
-guint sp_number_of_stops_before_stop(SPGradient const *gradient, SPStop *target);
+SPStop* sp_get_stop_i(SPGradient *gradient, unsigned int i);
+unsigned int sp_number_of_stops(SPGradient const *gradient);
+unsigned int sp_number_of_stops_before_stop(SPGradient const *gradient, SPStop *target);
-guint32 average_color(guint32 c1, guint32 c2, gdouble p = 0.5);
+guint32 average_color(guint32 c1, guint32 c2, double p = 0.5);
SPStop *sp_vector_add_stop(SPGradient *vector, SPStop* prev_stop, SPStop* next_stop, gfloat offset);
@@ -86,20 +87,20 @@ void sp_gradient_unset_swatch(SPDesktop *desktop, std::string id);
SPGradient *getGradient(SPItem *item, Inkscape::PaintTarget fill_or_stroke);
-void sp_item_gradient_set_coords(SPItem *item, GrPointType point_type, guint point_i, Geom::Point p_desk, Inkscape::PaintTarget fill_or_stroke, bool write_repr, bool scale);
+void sp_item_gradient_set_coords(SPItem *item, GrPointType point_type, unsigned int point_i, Geom::Point p_desk, Inkscape::PaintTarget fill_or_stroke, bool write_repr, bool scale);
/**
* Returns the position of point point_type of the gradient applied to item (either fill_or_stroke),
* in desktop coordinates.
*/
-Geom::Point getGradientCoords(SPItem *item, GrPointType point_type, guint point_i, Inkscape::PaintTarget fill_or_stroke);
+Geom::Point getGradientCoords(SPItem *item, GrPointType point_type, unsigned int point_i, Inkscape::PaintTarget fill_or_stroke);
SPGradient *sp_item_gradient_get_vector(SPItem *item, Inkscape::PaintTarget fill_or_stroke);
SPGradientSpread sp_item_gradient_get_spread(SPItem *item, Inkscape::PaintTarget fill_or_stroke);
-void sp_item_gradient_stop_set_style(SPItem *item, GrPointType point_type, guint point_i, Inkscape::PaintTarget fill_or_stroke, SPCSSAttr *stop);
-guint32 sp_item_gradient_stop_query_style(SPItem *item, GrPointType point_type, guint point_i, Inkscape::PaintTarget fill_or_stroke);
-void sp_item_gradient_edit_stop(SPItem *item, GrPointType point_type, guint point_i, Inkscape::PaintTarget fill_or_stroke);
+void sp_item_gradient_stop_set_style(SPItem *item, GrPointType point_type, unsigned int point_i, Inkscape::PaintTarget fill_or_stroke, SPCSSAttr *stop);
+guint32 sp_item_gradient_stop_query_style(SPItem *item, GrPointType point_type, unsigned int point_i, Inkscape::PaintTarget fill_or_stroke);
+void sp_item_gradient_edit_stop(SPItem *item, GrPointType point_type, unsigned int point_i, Inkscape::PaintTarget fill_or_stroke);
void sp_item_gradient_reverse_vector(SPItem *item, Inkscape::PaintTarget fill_or_stroke);
void sp_item_gradient_invert_vector_color(SPItem *item, Inkscape::PaintTarget fill_or_stroke);
diff --git a/src/graphlayout.h b/src/graphlayout.h
index 6083ad77f..0ffb645b6 100644
--- a/src/graphlayout.h
+++ b/src/graphlayout.h
@@ -14,10 +14,15 @@
#ifndef SEEN_GRAPHLAYOUT_H
#define SEEN_GRAPHLAYOUT_H
-struct _GSList;
-void graphlayout(_GSList const *const items);
+#include <list>
+
+typedef struct _GSList GSList;
class SPItem;
+
+void graphlayout(GSList const *const items);
+
bool isConnector(SPItem const *const item);
-#include <list>
-void filterConnectors(_GSList const *const items, std::list<SPItem *> &filtered);
+
+void filterConnectors(GSList const *const items, std::list<SPItem *> &filtered);
+
#endif // SEEN_GRAPHLAYOUT_H
diff --git a/src/guide-snapper.cpp b/src/guide-snapper.cpp
index 20c95459d..960caed67 100644
--- a/src/guide-snapper.cpp
+++ b/src/guide-snapper.cpp
@@ -48,7 +48,7 @@ Inkscape::GuideSnapper::LineList Inkscape::GuideSnapper::_getSnapLines(Geom::Poi
for (GSList const *l = _snapmanager->getNamedView()->guides; l != NULL; l = l->next) {
SPGuide const *g = SP_GUIDE(l->data);
if (g != guide_to_ignore) {
- s.push_back(std::make_pair(g->normal_to_line, g->point_on_line));
+ s.push_back(std::pair<Geom::Point, Geom::Point>(g->getNormal(), g->getPoint()));
}
}
diff --git a/src/help.cpp b/src/help.cpp
index 02a1930f4..643945a69 100644
--- a/src/help.cpp
+++ b/src/help.cpp
@@ -1,6 +1,4 @@
-#define __SP_HELP_C__
-
-/*
+/**
* Help/About window
*
* Authors:
@@ -17,20 +15,19 @@
# include "config.h"
#endif
-#include "ui/dialog/aboutbox.h"
-#include "path-prefix.h"
-#include "help.h"
-#include "file.h"
+#include <glibmm.h>
+#include "file.h"
+#include "help.h"
+#include "path-prefix.h"
+#include "ui/dialog/aboutbox.h"
-void
-sp_help_about (void)
+void sp_help_about()
{
Inkscape::UI::Dialog::AboutBox::show_about();
}
-void
-sp_help_open_tutorial(GtkMenuItem *, gpointer data)
+void sp_help_open_tutorial(GtkMenuItem *, void* data)
{
gchar const *name = static_cast<gchar const *>(data);
gchar *c = g_build_filename(INKSCAPE_TUTORIALSDIR, name, NULL);
diff --git a/src/help.h b/src/help.h
index 3fce65fef..3f83e3367 100644
--- a/src/help.h
+++ b/src/help.h
@@ -1,6 +1,4 @@
-#ifndef SEEN_HELP_H
-#define SEEN_HELP_H
-/*
+/**
* Authors:
* Lauris Kaplinski <lauris@kaplinski.com>
*
@@ -10,18 +8,18 @@
* Released under GNU GPL, read the file 'COPYING' for more information
*/
-#include <glib.h>
-#include <gtk/gtk.h>
+#ifndef SEEN_HELP_H
+#define SEEN_HELP_H
+
+typedef struct _GtkMenuItem GtkMenuItem;
/**
* Help/About window.
*/
-void sp_help_about(void);
-
-void sp_help_open_tutorial(GtkMenuItem *menuitem, gpointer data);
-
+void sp_help_about();
+void sp_help_open_tutorial(GtkMenuItem * /*unused*/, void* data);
-#endif /* !SEEN_HELP_H */
+#endif // !SEEN_HELP_H
/*
Local Variables:
@@ -32,4 +30,4 @@ void sp_help_open_tutorial(GtkMenuItem *menuitem, gpointer data);
fill-column:99
End:
*/
-// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8 :
diff --git a/src/helper-fns.h b/src/helper-fns.h
index 699fbbe11..2f1829c37 100644
--- a/src/helper-fns.h
+++ b/src/helper-fns.h
@@ -10,7 +10,7 @@
* Released under GNU GPL, read the file 'COPYING' for more information
*/
-#include <string.h>
+#include <cstring>
#include <vector>
#include <sstream>
@@ -63,34 +63,6 @@ inline bool helperfns_read_bool(gchar const *value, bool default_value){
* the function can only be used to convert numbers as given by gui elements that use localized representation
* numbers are delimeted by space
* @param value ascii representation of the number
- * @param size number of elements in string
- * @return the vector of the converted numbers
- */
-/*
-inline std::vector<gdouble> helperfns_read_vector(const gchar* value, int size){
- std::vector<gdouble> v(size, (gdouble) 0);
- std::istringstream is(value);
- for(int i = 0; i < size; i++){
- std::string str;
- is >> str;
- char *end;
-
- double ret = g_ascii_strtod(str.c_str(), &end);
- if (*end) {
- g_warning("helper-fns::helperfns_read_vector() Unable to convert \"%s\" to number", str.c_str());
- // We could leave this out, too. If strtod can't convert
- // anything, it will return zero.
- ret = 0;
- }
- v[i] = ret;
- };
- return v;
-}
-*/
-/* convert ascii representation to double
- * the function can only be used to convert numbers as given by gui elements that use localized representation
- * numbers are delimeted by space
- * @param value ascii representation of the number
* @return the vector of the converted numbers
*/
inline std::vector<gdouble> helperfns_read_vector(const gchar* value){
diff --git a/src/helper/action.h b/src/helper/action.h
index 1f2de87b4..4b81ee7f9 100644
--- a/src/helper/action.h
+++ b/src/helper/action.h
@@ -13,12 +13,8 @@
#define SEEN_INKSCAPE_SP_ACTION_H
#include "helper/action-context.h"
-#include <sigc++/sigc++.h>
+#include <sigc++/signal.h>
#include <glibmm/ustring.h>
-#include <glib-object.h>
-
-struct SPAction;
-struct SPActionClass;
#define SP_TYPE_ACTION (sp_action_get_type())
#define SP_ACTION(o) (G_TYPE_CHECK_INSTANCE_CAST((o), SP_TYPE_ACTION, SPAction))
diff --git a/src/helper/geom.cpp b/src/helper/geom.cpp
index c9148a634..6eba6e949 100644
--- a/src/helper/geom.cpp
+++ b/src/helper/geom.cpp
@@ -168,24 +168,25 @@ bounds_exact_transformed(Geom::PathVector const & pv, Geom::Affine const & t)
for (Geom::Path::const_iterator cit = it->begin(); cit != it->end_open(); ++cit) {
Geom::Curve const &c = *cit;
- if( is_straight_curve(c) )
- {
- bbox.expandTo( c.finalPoint() * t );
- }
- else if(Geom::CubicBezier const *cubic_bezier = dynamic_cast<Geom::CubicBezier const *>(&c))
- {
- Geom::Point c0 = (*cubic_bezier)[0] * t;
- Geom::Point c1 = (*cubic_bezier)[1] * t;
- Geom::Point c2 = (*cubic_bezier)[2] * t;
- Geom::Point c3 = (*cubic_bezier)[3] * t;
- cubic_bbox( c0[0], c0[1],
- c1[0], c1[1],
- c2[0], c2[1],
- c3[0], c3[1],
- bbox );
+ unsigned order = 0;
+ if (Geom::BezierCurve const* b = dynamic_cast<Geom::BezierCurve const*>(&c)) {
+ order = b->order();
}
- else
- {
+
+ if (order == 1) { // line segment
+ bbox.expandTo(c.finalPoint() * t);
+
+ // TODO: we can make the case for quadratics faster by degree elevating them to
+ // cubic and then taking the bbox of that.
+
+ } else if (order == 3) { // cubic bezier
+ Geom::CubicBezier const &cubic_bezier = static_cast<Geom::CubicBezier const&>(c);
+ Geom::Point c0 = cubic_bezier[0] * t;
+ Geom::Point c1 = cubic_bezier[1] * t;
+ Geom::Point c2 = cubic_bezier[2] * t;
+ Geom::Point c3 = cubic_bezier[3] * t;
+ cubic_bbox(c0[0], c0[1], c1[0], c1[1], c2[0], c2[1], c3[0], c3[1], bbox);
+ } else {
// should handle all not-so-easy curves:
Geom::Curve *ctemp = cit->transformed(t);
bbox.unionWith( ctemp->boundsExact());
@@ -356,8 +357,11 @@ geom_curve_bbox_wind_distance(Geom::Curve const & c, Geom::Affine const &m,
Geom::Coord tolerance, Geom::Rect const *viewbox,
Geom::Point &p0) // pass p0 through as it represents the last endpoint added (the finalPoint of last curve)
{
- if( is_straight_curve(c) )
- {
+ unsigned order = 0;
+ if (Geom::BezierCurve const* b = dynamic_cast<Geom::BezierCurve const*>(&c)) {
+ order = b->order();
+ }
+ if (order == 1) {
Geom::Point pe = c.finalPoint() * m;
if (bbox) {
bbox->expandTo(pe);
@@ -373,10 +377,11 @@ geom_curve_bbox_wind_distance(Geom::Curve const & c, Geom::Affine const &m,
}
p0 = pe;
}
- else if(Geom::CubicBezier const *cubic_bezier = dynamic_cast<Geom::CubicBezier const *>(&c)) {
- Geom::Point p1 = (*cubic_bezier)[1] * m;
- Geom::Point p2 = (*cubic_bezier)[2] * m;
- Geom::Point p3 = (*cubic_bezier)[3] * m;
+ else if (order == 3) {
+ Geom::CubicBezier const& cubic_bezier = static_cast<Geom::CubicBezier const&>(c);
+ Geom::Point p1 = cubic_bezier[1] * m;
+ Geom::Point p2 = cubic_bezier[2] * m;
+ Geom::Point p3 = cubic_bezier[3] * m;
// get approximate bbox from handles (convex hull property of beziers):
Geom::Rect swept(p0, p3);
@@ -402,7 +407,7 @@ geom_curve_bbox_wind_distance(Geom::Curve const & c, Geom::Affine const &m,
Geom::Path sbasis_path = Geom::cubicbezierpath_from_sbasis(c.toSBasis(), 0.1);
//recurse to convert the new path resulting from the sbasis to svgd
- for(Geom::Path::iterator iter = sbasis_path.begin(); iter != sbasis_path.end(); ++iter) {
+ for (Geom::Path::iterator iter = sbasis_path.begin(); iter != sbasis_path.end(); ++iter) {
geom_curve_bbox_wind_distance(*iter, m, pt, bbox, wind, dist, tolerance, viewbox, p0);
}
}
diff --git a/src/helper/gnome-utils.cpp b/src/helper/gnome-utils.cpp
index 957b7ea5e..3d2b333a2 100644
--- a/src/helper/gnome-utils.cpp
+++ b/src/helper/gnome-utils.cpp
@@ -1,9 +1,7 @@
-#define __GNOME_UTILS_C__
-
-/*
+/**
* Helpers
*
- * Author:
+ * Authors:
* Mitsuru Oka
* Lauris Kaplinski <lauris@kaplinski.com>
*
@@ -25,49 +23,48 @@
* Returns a GList containing strings allocated with g_malloc
* that have been splitted from @uri-list.
*/
-GList*
-gnome_uri_list_extract_uris (const gchar* uri_list)
+GList *gnome_uri_list_extract_uris(const gchar *uri_list)
{
- const gchar *p, *q;
- gchar *retval;
- GList *result = NULL;
-
- g_return_val_if_fail (uri_list != NULL, NULL);
-
- p = uri_list;
-
- /* We don't actually try to validate the URI according to RFC
- * 2396, or even check for allowed characters - we just ignore
- * comments and trim whitespace off the ends. We also
- * allow LF delimination as well as the specified CRLF.
- */
- while (p) {
- if (*p != '#') {
- while (isspace(*p))
- p++;
-
- q = p;
- while (*q && (*q != '\n') && (*q != '\r'))
- q++;
-
- if (q > p) {
- q--;
- while (q > p && isspace(*q))
- q--;
-
- retval = (gchar*)g_malloc (q - p + 2);
- strncpy (retval, p, q - p + 1);
- retval[q - p + 1] = '\0';
-
- result = g_list_prepend (result, retval);
- }
- }
- p = strchr (p, '\n');
- if (p)
- p++;
- }
-
- return g_list_reverse (result);
+ const gchar *p, *q;
+ gchar *retval;
+ GList *result = NULL;
+
+ g_return_val_if_fail(uri_list != NULL, NULL);
+
+ p = uri_list;
+
+ /* We don't actually try to validate the URI according to RFC
+ * 2396, or even check for allowed characters - we just ignore
+ * comments and trim whitespace off the ends. We also
+ * allow LF delimination as well as the specified CRLF.
+ */
+ while (p) {
+ if (*p != '#') {
+ while (isspace(*p))
+ p++;
+
+ q = p;
+ while (*q && (*q != '\n') && (*q != '\r'))
+ q++;
+
+ if (q > p) {
+ q--;
+ while (q > p && isspace(*q))
+ q--;
+
+ retval = (gchar *)g_malloc(q - p + 2);
+ strncpy(retval, p, q - p + 1);
+ retval[q - p + 1] = '\0';
+
+ result = g_list_prepend(result, retval);
+ }
+ }
+ p = strchr(p, '\n');
+ if (p)
+ p++;
+ }
+
+ return g_list_reverse(result);
}
/**
@@ -80,29 +77,40 @@ gnome_uri_list_extract_uris (const gchar* uri_list)
* Note that unlike gnome_uri_list_extract_uris() function, this
* will discard any non-file uri from the result value.
*/
-GList*
-gnome_uri_list_extract_filenames (const gchar* uri_list)
+GList *gnome_uri_list_extract_filenames(const gchar *uri_list)
{
- g_return_val_if_fail (uri_list != NULL, NULL);
-
- GList *result = gnome_uri_list_extract_uris (uri_list);
-
- GList *tmp_list = result;
- while (tmp_list) {
- gchar *s = (gchar*)tmp_list->data;
-
- GList *node = tmp_list;
- tmp_list = tmp_list->next;
-
- if (!strncmp (s, "file:", 5)) {
- node->data = g_filename_from_uri (s, NULL, NULL);
- /* not sure if this fallback is useful at all */
- if (!node->data) node->data = g_strdup (s+5);
- } else {
- result = g_list_remove_link(result, node);
- g_list_free_1 (node);
- }
- g_free (s);
- }
- return result;
+ g_return_val_if_fail(uri_list != NULL, NULL);
+
+ GList *result = gnome_uri_list_extract_uris(uri_list);
+
+ GList *tmp_list = result;
+ while (tmp_list) {
+ gchar *s = (gchar *)tmp_list->data;
+
+ GList *node = tmp_list;
+ tmp_list = tmp_list->next;
+
+ if (!strncmp(s, "file:", 5)) {
+ node->data = g_filename_from_uri(s, NULL, NULL);
+ /* not sure if this fallback is useful at all */
+ if (!node->data)
+ node->data = g_strdup(s + 5);
+ } else {
+ result = g_list_remove_link(result, node);
+ g_list_free_1(node);
+ }
+ g_free(s);
+ }
+ return result;
}
+
+/*
+ Local Variables:
+ mode:c++
+ c-file-style:"stroustrup"
+ c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
+ indent-tabs-mode:nil
+ fill-column:99
+ End:
+*/
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8 :
diff --git a/src/helper/gnome-utils.h b/src/helper/gnome-utils.h
index 3502b28df..6f2f28223 100644
--- a/src/helper/gnome-utils.h
+++ b/src/helper/gnome-utils.h
@@ -1,7 +1,7 @@
-/*
+/**
* GNOME Utils - Migration helper
*
- * Author:
+ * Authors:
* GNOME Developer
* Mitsuru Oka <oka326@parkcity.ne.jp>
* Lauris Kaplinski <lauris@ximian.com>
@@ -11,17 +11,15 @@
* Released under GNU GPL
*/
-
-#ifndef __GNOME_UTILS_H__
-#define __GNOME_UTILS_H__
+#ifndef SEEN_GNOME_UTILS_H
+#define SEEN_GNOME_UTILS_H
#include <glib.h>
GList *gnome_uri_list_extract_uris(gchar const *uri_list);
-
GList *gnome_uri_list_extract_filenames(gchar const *uri_list);
-#endif /* __GNOME_UTILS_H__ */
+#endif // !SEEN_GNOME_UTILS_H
/*
Local Variables:
@@ -32,4 +30,4 @@ GList *gnome_uri_list_extract_filenames(gchar const *uri_list);
fill-column:99
End:
*/
-// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8 :
diff --git a/src/helper/pixbuf-ops.cpp b/src/helper/pixbuf-ops.cpp
index d44b2207b..acb2be4da 100644
--- a/src/helper/pixbuf-ops.cpp
+++ b/src/helper/pixbuf-ops.cpp
@@ -19,7 +19,7 @@
#include <boost/scoped_ptr.hpp>
#include <2geom/transforms.h>
-#include "interface.h"
+#include "ui/interface.h"
#include "helper/png-write.h"
#include "display/cairo-utils.h"
#include "display/drawing.h"
diff --git a/src/helper/png-write.cpp b/src/helper/png-write.cpp
index a7ebe7423..32e50b537 100644
--- a/src/helper/png-write.cpp
+++ b/src/helper/png-write.cpp
@@ -18,7 +18,7 @@
#endif
#include <png.h>
-#include "interface.h"
+#include "ui/interface.h"
#include <2geom/rect.h>
#include <2geom/transforms.h>
#include <glib.h>
diff --git a/src/helper/stock-items.cpp b/src/helper/stock-items.cpp
index a12fa377a..582dcd2a8 100644
--- a/src/helper/stock-items.cpp
+++ b/src/helper/stock-items.cpp
@@ -28,7 +28,7 @@
#include "sp-gradient.h"
#include "document-private.h"
#include "sp-pattern.h"
-#include "marker.h"
+#include "sp-marker.h"
#include "desktop-handles.h"
#include "inkscape.h"
diff --git a/src/helper/window.cpp b/src/helper/window.cpp
index 98fbef170..98e886a38 100644
--- a/src/helper/window.cpp
+++ b/src/helper/window.cpp
@@ -1,6 +1,4 @@
-#define __SP_WINDOW_C__
-
-/*
+/**
* Generic window implementation
*
* Author:
@@ -9,61 +7,61 @@
* This code is in public domain
*/
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
-
-#if GLIBMM_DISABLE_DEPRECATED && HAVE_GLIBMM_THREADS_H
-#include <glibmm/threads.h>
-#endif
-
+#include <glibmm.h>
#include <gtkmm/window.h>
+#include "desktop.h"
#include "inkscape.h"
#include "shortcuts.h"
-#include "desktop.h"
#include "ui/tools/tool-base.h"
#include "window.h"
-#include <gtk/gtk.h>
static bool on_window_key_press(GdkEventKey* event)
{
- unsigned int shortcut;
- shortcut = Inkscape::UI::Tools::get_group0_keyval (event) |
+ unsigned shortcut = 0;
+ // FIXME why?
+ shortcut = Inkscape::UI::Tools::get_group0_keyval (event) |
( event->state & GDK_SHIFT_MASK ?
SP_SHORTCUT_SHIFT_MASK : 0 ) |
( event->state & GDK_CONTROL_MASK ?
SP_SHORTCUT_CONTROL_MASK : 0 ) |
( event->state & GDK_MOD1_MASK ?
SP_SHORTCUT_ALT_MASK : 0 );
- return sp_shortcut_invoke (shortcut, SP_ACTIVE_DESKTOP);
+ return sp_shortcut_invoke (shortcut, SP_ACTIVE_DESKTOP);
}
-Gtk::Window *
-Inkscape::UI::window_new (const gchar *title, unsigned int resizeable)
+Gtk::Window * Inkscape::UI::window_new (const gchar *title, unsigned int resizeable)
{
- Gtk::Window *window = new Gtk::Window(Gtk::WINDOW_TOPLEVEL);
- window->set_title (title);
- window->set_resizable (resizeable);
- window->signal_key_press_event().connect(sigc::ptr_fun(&on_window_key_press));
+ Gtk::Window *window = new Gtk::Window(Gtk::WINDOW_TOPLEVEL);
+ window->set_title (title);
+ window->set_resizable (resizeable);
+ window->signal_key_press_event().connect(sigc::ptr_fun(&on_window_key_press));
- return window;
+ return window;
}
-static gboolean
-sp_window_key_press(GtkWidget */*widget*/, GdkEventKey *event)
+static gboolean sp_window_key_press(GtkWidget *, GdkEventKey *event)
{
return on_window_key_press(event);
}
-GtkWidget *
-sp_window_new (const gchar *title, unsigned int resizeable)
+GtkWidget * sp_window_new (const gchar *title, unsigned int resizeable)
{
- GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
- gtk_window_set_title ((GtkWindow *) window, title);
- gtk_window_set_resizable ((GtkWindow *) window, resizeable);
- g_signal_connect_after ((GObject *) window, "key_press_event", (GCallback) sp_window_key_press, NULL);
+ GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+ gtk_window_set_title ((GtkWindow *) window, title);
+ gtk_window_set_resizable ((GtkWindow *) window, resizeable);
+ g_signal_connect_after ((GObject *) window, "key_press_event", (GCallback) sp_window_key_press, NULL);
- return window;
+ return window;
}
+/*
+ Local Variables:
+ mode:c++
+ c-file-style:"stroustrup"
+ c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
+ indent-tabs-mode:nil
+ fill-column:99
+ End:
+*/
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8 :
diff --git a/src/helper/window.h b/src/helper/window.h
index c6807f9e5..a0efcd292 100644
--- a/src/helper/window.h
+++ b/src/helper/window.h
@@ -1,7 +1,7 @@
-#ifndef __SP_WINDOW_H__
-#define __SP_WINDOW_H__
+#ifndef SEEN_SP_WINDOW_H
+#define SEEN_SP_WINDOW_H
-/*
+/**
* Generic window implementation
*
* Author:
@@ -17,10 +17,11 @@ namespace Gtk {
class Window;
}
-/*
- * This function is deprecated. Use Inkscape::UI::window_new instead.
- */
-GtkWidget *sp_window_new (const gchar *title, unsigned int resizeable);
+// Can we just get rid of this altogether?
+#if defined(GCC_VERSION) || defined(__clang__)
+__attribute__((deprecated))
+#endif
+GtkWidget * sp_window_new (const gchar *title, unsigned int resizeable);
namespace Inkscape {
namespace UI {
@@ -30,7 +31,7 @@ Gtk::Window *window_new (const gchar *title, unsigned int resizeable);
}
}
-#endif
+#endif // !SEEN_SP_WINDOW_H
/*
Local Variables:
@@ -41,4 +42,4 @@ Gtk::Window *window_new (const gchar *title, unsigned int resizeable);
fill-column:99
End:
*/
-// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8 :
diff --git a/src/icon-size.h b/src/icon-size.h
index 4bb4f1df6..d7a9c9b0b 100644
--- a/src/icon-size.h
+++ b/src/icon-size.h
@@ -12,8 +12,6 @@
* Released under GNU GPL, read the file 'COPYING' for more information
*/
-#include <glib.h>
-
#include <gtk/gtk.h>
namespace Inkscape {
diff --git a/src/inkscape-version.h b/src/inkscape-version.h
index 791351184..ff219047e 100644
--- a/src/inkscape-version.h
+++ b/src/inkscape-version.h
@@ -16,7 +16,7 @@
namespace Inkscape {
-extern gchar const *version_string; ///< Full version string
+extern char const *version_string; ///< Full version string
} // namespace Inkscape
diff --git a/src/inkscape.cpp b/src/inkscape.cpp
index e312e15b9..36a802e5f 100644
--- a/src/inkscape.cpp
+++ b/src/inkscape.cpp
@@ -71,7 +71,7 @@
#include "helper/action-context.h"
#include "helper/sp-marshal.h"
-static Inkscape::Application *inkscape = NULL;
+static InkscapeApplication *inkscape = NULL;
/* Backbones of configuration xml data */
#include "menus-skeleton.h"
@@ -99,16 +99,10 @@ enum {
# FORWARD DECLARATIONS
################################*/
-namespace Inkscape {
-struct ApplicationClass;
-}
-
-static void inkscape_class_init (Inkscape::ApplicationClass *klass);
-static void inkscape_init (SPObject *object);
static void inkscape_dispose (GObject *object);
-static void inkscape_activate_desktop_private (Inkscape::Application *inkscape, SPDesktop *desktop);
-static void inkscape_deactivate_desktop_private (Inkscape::Application *inkscape, SPDesktop *desktop);
+static void inkscape_activate_desktop_private (InkscapeApplication *inkscape, SPDesktop *desktop);
+static void inkscape_deactivate_desktop_private (InkscapeApplication *inkscape, SPDesktop *desktop);
class AppSelectionModel {
Inkscape::LayerModel _layer_model;
@@ -126,7 +120,7 @@ public:
Inkscape::Selection *getSelection() const { return _selection; }
};
-struct Inkscape::Application {
+struct InkscapeApplication {
GObject object;
Inkscape::XML::Document *menus;
std::map<SPDocument *, int> document_set;
@@ -140,26 +134,25 @@ struct Inkscape::Application {
guint trackalt;
};
-struct Inkscape::ApplicationClass {
+struct InkscapeApplicationClass {
GObjectClass object_class;
/* Signals */
- void (* change_selection) (Inkscape::Application * inkscape, Inkscape::Selection * selection);
- void (* change_subselection) (Inkscape::Application * inkscape, SPDesktop *desktop);
- void (* modify_selection) (Inkscape::Application * inkscape, Inkscape::Selection * selection, guint flags);
- void (* set_selection) (Inkscape::Application * inkscape, Inkscape::Selection * selection);
- void (* set_eventcontext) (Inkscape::Application * inkscape, Inkscape::UI::Tools::ToolBase * eventcontext);
- void (* activate_desktop) (Inkscape::Application * inkscape, SPDesktop * desktop);
- void (* deactivate_desktop) (Inkscape::Application * inkscape, SPDesktop * desktop);
- void (* destroy_document) (Inkscape::Application *inkscape, SPDocument *doc);
- void (* color_set) (Inkscape::Application *inkscape, SPColor *color, double opacity);
- void (* shut_down) (Inkscape::Application *inkscape);
- void (* dialogs_hide) (Inkscape::Application *inkscape);
- void (* dialogs_unhide) (Inkscape::Application *inkscape);
- void (* external_change) (Inkscape::Application *inkscape);
+ void (* change_selection) (InkscapeApplication * inkscape, Inkscape::Selection * selection);
+ void (* change_subselection) (InkscapeApplication * inkscape, SPDesktop *desktop);
+ void (* modify_selection) (InkscapeApplication * inkscape, Inkscape::Selection * selection, guint flags);
+ void (* set_selection) (InkscapeApplication * inkscape, Inkscape::Selection * selection);
+ void (* set_eventcontext) (InkscapeApplication * inkscape, Inkscape::UI::Tools::ToolBase * eventcontext);
+ void (* activate_desktop) (InkscapeApplication * inkscape, SPDesktop * desktop);
+ void (* deactivate_desktop) (InkscapeApplication * inkscape, SPDesktop * desktop);
+ void (* destroy_document) (InkscapeApplication *inkscape, SPDocument *doc);
+ void (* color_set) (InkscapeApplication *inkscape, SPColor *color, double opacity);
+ void (* shut_down) (InkscapeApplication *inkscape);
+ void (* dialogs_hide) (InkscapeApplication *inkscape);
+ void (* dialogs_unhide) (InkscapeApplication *inkscape);
+ void (* external_change) (InkscapeApplication *inkscape);
};
-static GObjectClass * parent_class;
static guint inkscape_signals[LAST_SIGNAL] = {0};
static void (* segv_handler) (int) = SIG_DFL;
@@ -175,48 +168,21 @@ static void (* bus_handler) (int) = SIG_DFL;
#define INKSCAPE_LEGACY_PROFILE_DIR ".inkscape"
#define MENUS_FILE "menus.xml"
-
-/**
- * Retrieves the GType for the Inkscape Application object.
- */
-GType
-inkscape_get_type (void)
-{
- static GType type = 0;
- if (!type) {
- GTypeInfo info = {
- sizeof (Inkscape::ApplicationClass),
- NULL, NULL,
- (GClassInitFunc) inkscape_class_init,
- NULL, NULL,
- sizeof (Inkscape::Application),
- 4,
- (GInstanceInitFunc) inkscape_init,
- NULL
- };
- type = g_type_register_static (G_TYPE_OBJECT, "Inkscape_Application", &info, (GTypeFlags)0);
- }
- return type;
-}
-
+G_DEFINE_TYPE(InkscapeApplication, inkscape, G_TYPE_OBJECT);
/**
* Initializes the inkscape class, registering all of its signal handlers
* and virtual functions
*/
static void
-inkscape_class_init (Inkscape::ApplicationClass * klass)
+inkscape_class_init (InkscapeApplicationClass * klass)
{
- GObjectClass * object_class;
-
- object_class = (GObjectClass *) klass;
-
- parent_class = (GObjectClass *)g_type_class_peek_parent (klass);
+ GObjectClass * object_class = G_OBJECT_CLASS(klass);
inkscape_signals[MODIFY_SELECTION] = g_signal_new ("modify_selection",
G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_FIRST,
- G_STRUCT_OFFSET (Inkscape::ApplicationClass, modify_selection),
+ G_STRUCT_OFFSET (InkscapeApplicationClass, modify_selection),
NULL, NULL,
sp_marshal_VOID__POINTER_UINT,
G_TYPE_NONE, 2,
@@ -224,7 +190,7 @@ inkscape_class_init (Inkscape::ApplicationClass * klass)
inkscape_signals[CHANGE_SELECTION] = g_signal_new ("change_selection",
G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_FIRST,
- G_STRUCT_OFFSET (Inkscape::ApplicationClass, change_selection),
+ G_STRUCT_OFFSET (InkscapeApplicationClass, change_selection),
NULL, NULL,
g_cclosure_marshal_VOID__POINTER,
G_TYPE_NONE, 1,
@@ -232,7 +198,7 @@ inkscape_class_init (Inkscape::ApplicationClass * klass)
inkscape_signals[CHANGE_SUBSELECTION] = g_signal_new ("change_subselection",
G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_FIRST,
- G_STRUCT_OFFSET (Inkscape::ApplicationClass, change_subselection),
+ G_STRUCT_OFFSET (InkscapeApplicationClass, change_subselection),
NULL, NULL,
g_cclosure_marshal_VOID__POINTER,
G_TYPE_NONE, 1,
@@ -240,7 +206,7 @@ inkscape_class_init (Inkscape::ApplicationClass * klass)
inkscape_signals[SET_SELECTION] = g_signal_new ("set_selection",
G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_FIRST,
- G_STRUCT_OFFSET (Inkscape::ApplicationClass, set_selection),
+ G_STRUCT_OFFSET (InkscapeApplicationClass, set_selection),
NULL, NULL,
g_cclosure_marshal_VOID__POINTER,
G_TYPE_NONE, 1,
@@ -248,7 +214,7 @@ inkscape_class_init (Inkscape::ApplicationClass * klass)
inkscape_signals[SET_EVENTCONTEXT] = g_signal_new ("set_eventcontext",
G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_FIRST,
- G_STRUCT_OFFSET (Inkscape::ApplicationClass, set_eventcontext),
+ G_STRUCT_OFFSET (InkscapeApplicationClass, set_eventcontext),
NULL, NULL,
g_cclosure_marshal_VOID__POINTER,
G_TYPE_NONE, 1,
@@ -256,7 +222,7 @@ inkscape_class_init (Inkscape::ApplicationClass * klass)
inkscape_signals[ACTIVATE_DESKTOP] = g_signal_new ("activate_desktop",
G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_FIRST,
- G_STRUCT_OFFSET (Inkscape::ApplicationClass, activate_desktop),
+ G_STRUCT_OFFSET (InkscapeApplicationClass, activate_desktop),
NULL, NULL,
g_cclosure_marshal_VOID__POINTER,
G_TYPE_NONE, 1,
@@ -264,7 +230,7 @@ inkscape_class_init (Inkscape::ApplicationClass * klass)
inkscape_signals[DEACTIVATE_DESKTOP] = g_signal_new ("deactivate_desktop",
G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_FIRST,
- G_STRUCT_OFFSET (Inkscape::ApplicationClass, deactivate_desktop),
+ G_STRUCT_OFFSET (InkscapeApplicationClass, deactivate_desktop),
NULL, NULL,
g_cclosure_marshal_VOID__POINTER,
G_TYPE_NONE, 1,
@@ -272,28 +238,28 @@ inkscape_class_init (Inkscape::ApplicationClass * klass)
inkscape_signals[SHUTDOWN_SIGNAL] = g_signal_new ("shut_down",
G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_FIRST,
- G_STRUCT_OFFSET (Inkscape::ApplicationClass, shut_down),
+ G_STRUCT_OFFSET (InkscapeApplicationClass, shut_down),
NULL, NULL,
g_cclosure_marshal_VOID__VOID,
G_TYPE_NONE, 0);
inkscape_signals[DIALOGS_HIDE] = g_signal_new ("dialogs_hide",
G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_FIRST,
- G_STRUCT_OFFSET (Inkscape::ApplicationClass, dialogs_hide),
+ G_STRUCT_OFFSET (InkscapeApplicationClass, dialogs_hide),
NULL, NULL,
g_cclosure_marshal_VOID__VOID,
G_TYPE_NONE, 0);
inkscape_signals[DIALOGS_UNHIDE] = g_signal_new ("dialogs_unhide",
G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_FIRST,
- G_STRUCT_OFFSET (Inkscape::ApplicationClass, dialogs_unhide),
+ G_STRUCT_OFFSET (InkscapeApplicationClass, dialogs_unhide),
NULL, NULL,
g_cclosure_marshal_VOID__VOID,
G_TYPE_NONE, 0);
inkscape_signals[EXTERNAL_CHANGE] = g_signal_new ("external_change",
G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_FIRST,
- G_STRUCT_OFFSET (Inkscape::ApplicationClass, external_change),
+ G_STRUCT_OFFSET (InkscapeApplicationClass, external_change),
NULL, NULL,
g_cclosure_marshal_VOID__VOID,
G_TYPE_NONE, 0);
@@ -494,10 +460,10 @@ void inkscape_autosave_init()
static void
-inkscape_init (SPObject * object)
+inkscape_init (InkscapeApplication * object)
{
if (!inkscape) {
- inkscape = (Inkscape::Application *) object;
+ inkscape = (InkscapeApplication *) object;
} else {
g_assert_not_reached ();
}
@@ -515,7 +481,7 @@ inkscape_init (SPObject * object)
static void
inkscape_dispose (GObject *object)
{
- Inkscape::Application *inkscape = (Inkscape::Application *) object;
+ InkscapeApplication *inkscape = (InkscapeApplication *) object;
g_assert (!inkscape->desktops);
@@ -530,7 +496,7 @@ inkscape_dispose (GObject *object)
inkscape->selection_models.~map();
inkscape->document_set.~map();
- G_OBJECT_CLASS (parent_class)->dispose (object);
+ G_OBJECT_CLASS (inkscape_parent_class)->dispose (object);
gtk_main_quit ();
}
@@ -580,14 +546,14 @@ void inkscape_trackalt(guint trackvalue)
static void
-inkscape_activate_desktop_private (Inkscape::Application */*inkscape*/, SPDesktop *desktop)
+inkscape_activate_desktop_private (InkscapeApplication */*inkscape*/, SPDesktop *desktop)
{
desktop->set_active (true);
}
static void
-inkscape_deactivate_desktop_private (Inkscape::Application */*inkscape*/, SPDesktop *desktop)
+inkscape_deactivate_desktop_private (InkscapeApplication */*inkscape*/, SPDesktop *desktop)
{
desktop->set_active (false);
}
@@ -835,7 +801,7 @@ private:
void
inkscape_application_init (const gchar *argv0, gboolean use_gui)
{
- inkscape = (Inkscape::Application *)g_object_new (SP_TYPE_INKSCAPE, NULL);
+ inkscape = (InkscapeApplication *)g_object_new (SP_TYPE_INKSCAPE, NULL);
/* fixme: load application defaults */
segv_handler = signal (SIGSEGV, inkscape_crash_handler);
@@ -904,9 +870,9 @@ inkscape_application_init (const gchar *argv0, gboolean use_gui)
}
/**
- * Returns the current Inkscape::Application global object
+ * Returns the current InkscapeApplication global object
*/
-Inkscape::Application *
+InkscapeApplication *
inkscape_get_instance()
{
return inkscape;
@@ -921,7 +887,7 @@ gboolean inkscape_use_gui()
* Menus management
*
*/
-bool inkscape_load_menus( Inkscape::Application * inkscape )
+bool inkscape_load_menus( InkscapeApplication * inkscape )
{
gchar *fn = profile_path(MENUS_FILE);
gchar *menus_xml = 0;
@@ -1391,7 +1357,7 @@ inkscape_action_context_for_document(SPDocument *doc)
#####################*/
void
-inkscape_refresh_display (Inkscape::Application *inkscape)
+inkscape_refresh_display (InkscapeApplication *inkscape)
{
for (GSList *l = inkscape->desktops; l != NULL; l = l->next) {
(static_cast<Inkscape::UI::View::View*>(l->data))->requestRedraw();
@@ -1404,7 +1370,7 @@ inkscape_refresh_display (Inkscape::Application *inkscape)
* saves the preferences if appropriate, and quits.
*/
void
-inkscape_exit (Inkscape::Application */*inkscape*/)
+inkscape_exit (InkscapeApplication */*inkscape*/)
{
g_assert (INKSCAPE);
@@ -1546,7 +1512,7 @@ profile_path(const char *filename)
}
Inkscape::XML::Node *
-inkscape_get_menus (Inkscape::Application * inkscape)
+inkscape_get_menus (InkscapeApplication * inkscape)
{
Inkscape::XML::Node *repr = inkscape->menus->root();
g_assert (!(strcmp (repr->name(), "inkscape")));
diff --git a/src/inkscape.h b/src/inkscape.h
index 823e7524f..3a9b85fc9 100644
--- a/src/inkscape.h
+++ b/src/inkscape.h
@@ -28,9 +28,10 @@ class ToolBase;
}
}
+struct InkscapeApplication;
+
namespace Inkscape {
class ActionContext;
- struct Application;
namespace XML {
class Node;
struct Document;
@@ -46,11 +47,11 @@ void inkscape_application_init (const gchar *argv0, gboolean use_gui);
bool inkscape_load_config (const gchar *filename, Inkscape::XML::Document *config, const gchar *skeleton, unsigned int skel_size, const gchar *e_notreg, const gchar *e_notxml, const gchar *e_notsp, const gchar *warn);
/* Menus */
-bool inkscape_load_menus (Inkscape::Application * inkscape);
-bool inkscape_save_menus (Inkscape::Application * inkscape);
-Inkscape::XML::Node *inkscape_get_menus (Inkscape::Application * inkscape);
+bool inkscape_load_menus (InkscapeApplication * inkscape);
+bool inkscape_save_menus (InkscapeApplication * inkscape);
+Inkscape::XML::Node *inkscape_get_menus (InkscapeApplication * inkscape);
-Inkscape::Application *inkscape_get_instance();
+InkscapeApplication *inkscape_get_instance();
gboolean inkscape_use_gui();
bool inkscapeIsCrashing();
@@ -108,13 +109,13 @@ bool inkscape_remove_document (SPDocument *document);
* fixme: This has to be rethought
*/
-void inkscape_refresh_display (Inkscape::Application *inkscape);
+void inkscape_refresh_display (InkscapeApplication *inkscape);
/*
* fixme: This also
*/
-void inkscape_exit (Inkscape::Application *inkscape);
+void inkscape_exit (InkscapeApplication *inkscape);
#endif
diff --git a/src/inkview.cpp b/src/inkview.cpp
index 82bd08e34..2969bb140 100644
--- a/src/inkview.cpp
+++ b/src/inkview.cpp
@@ -62,7 +62,7 @@
#include "inkscape-private.h"
-Inkscape::Application *inkscape;
+InkscapeApplication *inkscape;
#include <iostream>
@@ -232,7 +232,7 @@ main (int argc, const char **argv)
ss.view = NULL;
ss.fullscreen = false;
- inkscape = (Inkscape::Application *)g_object_new (SP_TYPE_INKSCAPE, NULL);
+ inkscape = (InkscapeApplication *)g_object_new (SP_TYPE_INKSCAPE, NULL);
// starting at where the commandline options stopped parsing because
// we want all the files to be in the list
@@ -570,16 +570,6 @@ static void usage()
exit(1);
}
-#ifdef XXX
-/* TODO !!! make this temporary stub unnecessary */
-Inkscape::Application *inkscape_get_instance() { return NULL; }
-void inkscape_ref (void) {}
-void inkscape_unref (void) {}
-void inkscape_add_document (SPDocument *document) {}
-void inkscape_remove_document (SPDocument *document) {}
-#endif
-
-
/*
Local Variables:
mode:c++
diff --git a/src/isinf.h b/src/isinf.h
index b4c56f79d..8d590b972 100644
--- a/src/isinf.h
+++ b/src/isinf.h
@@ -2,7 +2,7 @@
#define __ISINF_H__
/*
- * Fix for missing std::isnormal with SOLARIS8/GCC3.2
+ * Fix for missing std::isinf with SOLARIS8/GCC3.2
*/
#if defined (SOLARIS)
diff --git a/src/isnormal.h b/src/isnormal.h
deleted file mode 100644
index d53105926..000000000
--- a/src/isnormal.h
+++ /dev/null
@@ -1,19 +0,0 @@
-#ifndef __ISNORMAL_H__
-#define __ISNORMAL_H__
-
-/*
- * Fix for missing std::isnormal with SOLARIS8/GCC3.2
- */
-
-#if defined (SOLARIS)
-
- #include <ieeefp.h>
- #define isnormal(x) (fpclass(x) >= FP_NZERO)
-
-#else
-
- using std::isnormal;
-
-#endif
-
-#endif /* __ISNORMAL_H__ */
diff --git a/src/knot-holder-entity.h b/src/knot-holder-entity.h
index dde60f515..43ab25e5c 100644
--- a/src/knot-holder-entity.h
+++ b/src/knot-holder-entity.h
@@ -14,11 +14,11 @@
* Released under GNU GPL
*/
-#include <glib.h>
-#include "knot.h"
#include <2geom/forward.h>
-#include "snapper.h"
+
#include "display/sp-canvas-item.h"
+#include "knot.h"
+#include "snapper.h"
class SPItem;
class SPKnot;
@@ -31,7 +31,7 @@ namespace LivePathEffect {
} // namespace LivePathEffect
} // namespace Inkscape
-typedef void (* SPKnotHolderSetFunc) (SPItem *item, Geom::Point const &p, Geom::Point const &origin, guint state);
+typedef void (* SPKnotHolderSetFunc) (SPItem *item, Geom::Point const &p, Geom::Point const &origin, unsigned int state);
typedef Geom::Point (* SPKnotHolderGetFunc) (SPItem *item);
/**
@@ -50,22 +50,22 @@ public:
virtual void create(SPDesktop *desktop, SPItem *item, KnotHolder *parent,
Inkscape::ControlType type = Inkscape::CTRL_TYPE_UNKNOWN,
- const gchar *tip = "",
+ char const*tip = "",
SPKnotShapeType shape = SP_KNOT_SHAPE_DIAMOND,
SPKnotModeType mode = SP_KNOT_MODE_XOR,
guint32 color = 0xffffff00);
/* the get/set/click handlers are virtual functions; each handler class for a knot
should be derived from KnotHolderEntity and override these functions */
- virtual void knot_set(Geom::Point const &p, Geom::Point const &origin, guint state) = 0;
+ virtual void knot_set(Geom::Point const &p, Geom::Point const &origin, unsigned int state) = 0;
virtual Geom::Point knot_get() const = 0;
- virtual void knot_click(guint /*state*/) {}
+ virtual void knot_click(unsigned int /*state*/) {}
void update_knot();
//private:
- Geom::Point snap_knot_position(Geom::Point const &p, guint state);
- Geom::Point snap_knot_position_constrained(Geom::Point const &p, Inkscape::Snapper::SnapConstraint const &constraint, guint state);
+ Geom::Point snap_knot_position(Geom::Point const &p, unsigned int state);
+ Geom::Point snap_knot_position_constrained(Geom::Point const &p, Inkscape::Snapper::SnapConstraint const &constraint, unsigned int state);
SPKnot *knot;
SPItem *item;
@@ -77,11 +77,11 @@ public:
static int counter;
/** Connection to \a knot's "moved" signal. */
- guint handler_id;
+ unsigned int handler_id;
/** Connection to \a knot's "clicked" signal. */
- guint _click_handler_id;
+ unsigned int _click_handler_id;
/** Connection to \a knot's "ungrabbed" signal. */
- guint _ungrab_handler_id;
+ unsigned int _ungrab_handler_id;
private:
sigc::connection _moved_connection;
@@ -103,7 +103,7 @@ class PatternKnotHolderEntityXY : public KnotHolderEntity {
public:
PatternKnotHolderEntityXY(bool fill) : KnotHolderEntity(), _fill(fill) {}
virtual Geom::Point knot_get() const;
- virtual void knot_set(Geom::Point const &p, Geom::Point const &origin, guint state);
+ virtual void knot_set(Geom::Point const &p, Geom::Point const &origin, unsigned int state);
private:
// true if the entity tracks fill, false for stroke
bool _fill;
@@ -113,7 +113,7 @@ class PatternKnotHolderEntityAngle : public KnotHolderEntity {
public:
PatternKnotHolderEntityAngle(bool fill) : KnotHolderEntity(), _fill(fill) {}
virtual Geom::Point knot_get() const;
- virtual void knot_set(Geom::Point const &p, Geom::Point const &origin, guint state);
+ virtual void knot_set(Geom::Point const &p, Geom::Point const &origin, unsigned int state);
private:
bool _fill;
};
@@ -122,7 +122,7 @@ class PatternKnotHolderEntityScale : public KnotHolderEntity {
public:
PatternKnotHolderEntityScale(bool fill) : KnotHolderEntity(), _fill(fill) {}
virtual Geom::Point knot_get() const;
- virtual void knot_set(Geom::Point const &p, Geom::Point const &origin, guint state);
+ virtual void knot_set(Geom::Point const &p, Geom::Point const &origin, unsigned int state);
private:
bool _fill;
};
diff --git a/src/knot-ptr.cpp b/src/knot-ptr.cpp
new file mode 100644
index 000000000..de8118ba7
--- /dev/null
+++ b/src/knot-ptr.cpp
@@ -0,0 +1,25 @@
+#include <algorithm>
+#include <glib.h>
+#include <list>
+#include "knot-ptr.h"
+
+static std::list<void*> deleted_knots;
+
+void knot_deleted_callback(void* knot) {
+ if (std::find(deleted_knots.begin(), deleted_knots.end(), knot) == deleted_knots.end()) {
+ deleted_knots.push_back(knot);
+ }
+}
+
+void knot_created_callback(void* knot) {
+ std::list<void*>::iterator it = std::find(deleted_knots.begin(), deleted_knots.end(), knot);
+ if (it != deleted_knots.end()) {
+ deleted_knots.erase(it);
+ }
+}
+
+void check_if_knot_deleted(void* knot) {
+ if (std::find(deleted_knots.begin(), deleted_knots.end(), knot) != deleted_knots.end()) {
+ g_warning("Accessed knot after it was freed at %p", knot);
+ }
+}
diff --git a/src/knot-ptr.h b/src/knot-ptr.h
new file mode 100644
index 000000000..5895dfd2e
--- /dev/null
+++ b/src/knot-ptr.h
@@ -0,0 +1,8 @@
+#ifndef KNOT_PTR_DETECTOR
+#define KNOT_PTR_DETECTOR
+
+void knot_deleted_callback(void* knot);
+void knot_created_callback(void* knot);
+void check_if_knot_deleted(void* knot);
+
+#endif
diff --git a/src/knot.cpp b/src/knot.cpp
index 2f8f55a2e..4118873c1 100644
--- a/src/knot.cpp
+++ b/src/knot.cpp
@@ -21,12 +21,16 @@
#include "desktop.h"
#include "desktop-handles.h"
#include "knot.h"
+#include "knot-ptr.h"
#include "document.h"
#include "document-undo.h"
#include "preferences.h"
#include "message-stack.h"
#include "message-context.h"
+#include "ui/tools-switch.h"
#include "ui/tools/tool-base.h"
+#include "ui/tools/node-tool.h"
+#include <gtk/gtk.h>
using Inkscape::DocumentUndo;
@@ -118,6 +122,7 @@ SPKnot::SPKnot(SPDesktop *desktop, gchar const *tip)
this->_event_handler_id = g_signal_connect(G_OBJECT(this->item), "event",
G_CALLBACK(sp_knot_handler), this);
+ knot_created_callback(this);
}
SPKnot::~SPKnot() {
@@ -165,6 +170,7 @@ SPKnot::~SPKnot() {
// FIXME: cannot snap to destroyed knot (lp:1309050)
//sp_event_context_discard_delayed_snap_event(this->desktop->event_context);
+ knot_deleted_callback(this);
}
void SPKnot::startDragging(Geom::Point const &p, gint x, gint y, guint32 etime) {
@@ -257,6 +263,10 @@ static int sp_knot_handler(SPCanvasItem */*item*/, GdkEvent *event, SPKnot *knot
consumed = TRUE;
}
}
+ if (tools_isactive(knot->desktop, TOOLS_NODES)) {
+ Inkscape::UI::Tools::NodeTool *nt = static_cast<Inkscape::UI::Tools::NodeTool*>(knot->desktop->event_context);
+ nt->update_helperpath();
+ }
break;
case GDK_MOTION_NOTIFY:
if (grabbed && knot->desktop && knot->desktop->event_context && !knot->desktop->event_context->space_panning) {
@@ -289,6 +299,10 @@ static int sp_knot_handler(SPCanvasItem */*item*/, GdkEvent *event, SPKnot *knot
sp_knot_handler_request_position(event, knot);
moved = TRUE;
}
+ if (tools_isactive(knot->desktop, TOOLS_NODES)) {
+ Inkscape::UI::Tools::NodeTool *nt = static_cast<Inkscape::UI::Tools::NodeTool*>(knot->desktop->event_context);
+ nt->update_helperpath();
+ }
break;
case GDK_ENTER_NOTIFY:
knot->setFlag(SP_KNOT_MOUSEOVER, TRUE);
diff --git a/src/knot.h b/src/knot.h
index b18f89566..e3ad98e66 100644
--- a/src/knot.h
+++ b/src/knot.h
@@ -14,18 +14,20 @@
* Released under GNU GPL, read the file 'COPYING' for more information
*/
-#include <gdk/gdk.h>
#include <2geom/point.h>
-#include "knot-enums.h"
-#include <stddef.h>
#include <sigc++/sigc++.h>
+
+#include "knot-enums.h"
#include "enums.h"
-#include <gtk/gtk.h>
-#include "sp-item.h"
class SPDesktop;
+class SPItem;
struct SPCanvasItem;
+typedef struct _GdkCursor GdkCursor;
+typedef union _GdkEvent GdkEvent;
+typedef unsigned int guint32;
+
#define SP_KNOT(obj) (dynamic_cast<SPKnot*>(static_cast<SPKnot*>(obj)))
#define SP_IS_KNOT(obj) (dynamic_cast<const SPKnot*>(static_cast<const SPKnot*>(obj)) != NULL)
@@ -38,19 +40,17 @@ struct SPCanvasItem;
*/
class SPKnot {
public:
- SPKnot(SPDesktop *desktop, gchar const *tip);
+ SPKnot(SPDesktop *desktop, char const *tip);
virtual ~SPKnot();
-
- int ref_count;
-
+ int ref_count; // FIXME encapsulation
SPDesktop *desktop; /**< Desktop we are on. */
SPCanvasItem *item; /**< Our CanvasItem. */
SPItem *owner; /**< Optional Owner Item */
- guint flags;
+ unsigned int flags;
- guint size; /**< Always square. */
+ unsigned int size; /**< Always square. */
Geom::Point pos; /**< Our desktop coordinates. */
Geom::Point grabbed_rel_pos; /**< Grabbed relative position. */
Geom::Point drag_origin; /**< Origin of drag. */
@@ -61,39 +61,41 @@ public:
guint32 fill[SP_KNOT_VISIBLE_STATES];
guint32 stroke[SP_KNOT_VISIBLE_STATES];
- guchar *image[SP_KNOT_VISIBLE_STATES];
+ unsigned char *image[SP_KNOT_VISIBLE_STATES];
GdkCursor *cursor[SP_KNOT_VISIBLE_STATES];
GdkCursor *saved_cursor;
- gpointer pixbuf;
+ void* pixbuf;
- gchar *tip;
+ char *tip;
- gulong _event_handler_id;
+ unsigned long _event_handler_id;
double pressure; /**< The tablet pen pressure when the knot is being dragged. */
- sigc::signal<void, SPKnot *, guint> click_signal;
- sigc::signal<void, SPKnot*, guint> doubleclicked_signal;
- sigc::signal<void, SPKnot*, guint> grabbed_signal;
- sigc::signal<void, SPKnot *, guint> ungrabbed_signal;
- sigc::signal<void, SPKnot *, Geom::Point const &, guint> moved_signal;
+ // FIXME: signals should NOT need to emit the object they came from, the callee should
+ // be able to figure that out
+ sigc::signal<void, SPKnot *, unsigned int> click_signal;
+ sigc::signal<void, SPKnot*, unsigned int> doubleclicked_signal;
+ sigc::signal<void, SPKnot*, unsigned int> grabbed_signal;
+ sigc::signal<void, SPKnot *, unsigned int> ungrabbed_signal;
+ sigc::signal<void, SPKnot *, Geom::Point const &, unsigned int> moved_signal;
sigc::signal<bool, SPKnot*, GdkEvent*> event_signal;
- sigc::signal<bool, SPKnot*, Geom::Point*, guint> request_signal;
+ sigc::signal<bool, SPKnot*, Geom::Point*, unsigned int> request_signal;
//TODO: all the members above should eventualle become private, accessible via setters/getters
- void setSize(guint i);
- void setShape(guint i);
- void setAnchor(guint i);
- void setMode(guint i);
- void setPixbuf(gpointer p);
+ void setSize(unsigned int i);
+ void setShape(unsigned int i);
+ void setAnchor(unsigned int i);
+ void setMode(unsigned int i);
+ void setPixbuf(void* p);
void setFill(guint32 normal, guint32 mouseover, guint32 dragging);
void setStroke(guint32 normal, guint32 mouseover, guint32 dragging);
- void setImage(guchar* normal, guchar* mouseover, guchar* dragging);
+ void setImage(unsigned char* normal, unsigned char* mouseover, unsigned char* dragging);
void setCursor(GdkCursor* normal, GdkCursor* mouseover, GdkCursor* dragging);
@@ -110,7 +112,7 @@ public:
/**
* Set flag in knot, with side effects.
*/
- void setFlag(guint flag, bool set);
+ void setFlag(unsigned int flag, bool set);
/**
* Update knot's pixbuf and set its control state.
@@ -120,17 +122,17 @@ public:
/**
* Request or set new position for knot.
*/
- void requestPosition(Geom::Point const &pos, guint state);
+ void requestPosition(Geom::Point const &pos, unsigned int state);
/**
* Update knot for dragging and tell canvas an item was grabbed.
*/
- void startDragging(Geom::Point const &p, gint x, gint y, guint32 etime);
+ void startDragging(Geom::Point const &p, int x, int y, guint32 etime);
/**
* Move knot to new position and emits "moved" signal.
*/
- void setPosition(Geom::Point const &p, guint state);
+ void setPosition(Geom::Point const &p, unsigned int state);
/**
* Move knot to new position, without emitting a MOVED signal.
diff --git a/src/knotholder.cpp b/src/knotholder.cpp
index 553f25842..f46daa09e 100644
--- a/src/knotholder.cpp
+++ b/src/knotholder.cpp
@@ -162,8 +162,15 @@ KnotHolder::knot_clicked_handler(SPKnot *knot, guint state)
}
// for drag, this is done by ungrabbed_handler, but for click we must do it here
- DocumentUndo::done(saved_item->document, object_verb,
- _("Change handle"));
+
+ if (saved_item) { //increasingly aggressive sanity checks
+ if (saved_item->document) {
+ if (object_verb <= SP_VERB_LAST && object_verb >= SP_VERB_INVALID) {
+ DocumentUndo::done(saved_item->document, object_verb,
+ _("Change handle"));
+ }
+ }
+ } // else { abort(); }
}
void
@@ -216,7 +223,6 @@ KnotHolder::knot_ungrabbed_handler(SPKnot */*knot*/, guint)
if (lpeItem) {
// This writes all parameters to SVG. Is this sufficiently efficient or should we only
// write the ones that were changed?
-
Inkscape::LivePathEffect::Effect *lpe = lpeItem->getCurrentLPE();
if (lpe) {
LivePathEffectObject *lpeobj = lpe->getLPEObj();
@@ -248,8 +254,7 @@ KnotHolder::knot_ungrabbed_handler(SPKnot */*knot*/, guint)
}
}
- DocumentUndo::done(object->document, object_verb,
- _("Move handle"));
+ DocumentUndo::done(object->document, object_verb, _("Move handle"));
}
}
diff --git a/src/knotholder.h b/src/knotholder.h
index 3632635f5..f1bacebe5 100644
--- a/src/knotholder.h
+++ b/src/knotholder.h
@@ -17,17 +17,20 @@
*
*/
-#include <glib.h>
#include <2geom/forward.h>
#include <list>
#include <sigc++/connection.h>
namespace Inkscape {
+namespace UI {
+class ShapeEditor;
+}
namespace XML {
class Node;
}
namespace LivePathEffect {
class PowerStrokePointArrayParamKnotHolderEntity;
+class FilletPointArrayParamKnotHolderEntity;
}
}
@@ -46,9 +49,9 @@ public:
void update_knots();
- void knot_moved_handler(SPKnot *knot, Geom::Point const &p, guint state);
- void knot_clicked_handler(SPKnot *knot, guint state);
- void knot_ungrabbed_handler(SPKnot *knot, guint);
+ void knot_moved_handler(SPKnot *knot, Geom::Point const &p, unsigned int state);
+ void knot_clicked_handler(SPKnot *knot, unsigned int state);
+ void knot_ungrabbed_handler(SPKnot *knot, unsigned int);
void add(KnotHolderEntity *e);
@@ -58,8 +61,9 @@ public:
bool knot_mouseover() const;
- friend class ShapeEditor;
- friend class Inkscape::LivePathEffect::PowerStrokePointArrayParamKnotHolderEntity;
+ friend class Inkscape::UI::ShapeEditor; // FIXME why?
+ friend class Inkscape::LivePathEffect::PowerStrokePointArrayParamKnotHolderEntity; // why?
+ friend class Inkscape::LivePathEffect::FilletPointArrayParamKnotHolderEntity; // why?
protected:
@@ -74,7 +78,7 @@ protected:
SPKnotHolderReleasedFunc released;
- gboolean local_change; ///< if true, no need to recreate knotholder if repr was changed.
+ bool local_change; ///< if true, no need to recreate knotholder if repr was changed.
bool dragging;
diff --git a/src/layer-manager.h b/src/layer-manager.h
index 1b69324d5..9eea68004 100644
--- a/src/layer-manager.h
+++ b/src/layer-manager.h
@@ -10,11 +10,12 @@
#ifndef SEEN_INKSCAPE_LAYER_MANAGER_H
#define SEEN_INKSCAPE_LAYER_MANAGER_H
+#include <vector>
+#include <map>
+
#include "document-subset.h"
#include "gc-finalized.h"
#include "gc-soft-ptr.h"
-#include <vector>
-#include <map>
class SPDesktop;
class SPDocument;
@@ -29,8 +30,8 @@ public:
virtual ~LayerManager();
void setCurrentLayer( SPObject* obj );
- void renameLayer( SPObject* obj, gchar const *label, bool uniquify );
- Glib::ustring getNextLayerName( SPObject* obj, gchar const *label);
+ void renameLayer( SPObject* obj, char const *label, bool uniquify );
+ Glib::ustring getNextLayerName( SPObject* obj, char const *label);
sigc::connection connectCurrentLayerChanged(const sigc::slot<void, SPObject *> & slot) {
return _layer_changed_signal.connect(slot);
@@ -44,7 +45,7 @@ private:
friend class LayerWatcher;
class LayerWatcher;
- void _objectModified( SPObject* obj, guint flags );
+ void _objectModified( SPObject* obj, unsigned int flags );
void _setDocument(SPDocument *document);
void _rebuild();
void _selectedLayerChanged(SPObject *layer);
diff --git a/src/layer-model.h b/src/layer-model.h
index 79b7fbe44..86aba63ef 100644
--- a/src/layer-model.h
+++ b/src/layer-model.h
@@ -22,12 +22,8 @@
*
*/
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include <stddef.h>
#include <sigc++/sigc++.h>
+#include <cstddef>
class SPDocument;
class SPObject;
diff --git a/src/libdepixelize/kopftracer2011.h b/src/libdepixelize/kopftracer2011.h
index 598f6c79c..c60d0a61a 100644
--- a/src/libdepixelize/kopftracer2011.h
+++ b/src/libdepixelize/kopftracer2011.h
@@ -27,6 +27,7 @@
#include <string>
+#include <glibmm.h>
// Contains exception definitions
#include <glibmm/fileutils.h>
#include <gdkmm/pixbuf.h>
diff --git a/src/libnrtype/FontFactory.cpp b/src/libnrtype/FontFactory.cpp
index d052eeb42..c8f5e1fef 100644
--- a/src/libnrtype/FontFactory.cpp
+++ b/src/libnrtype/FontFactory.cpp
@@ -392,6 +392,7 @@ GList* font_factory::GetUIStyles(PangoFontFamily * in)
return ret;
}
+
font_instance* font_factory::FaceFromStyle(SPStyle const *style)
{
font_instance *font = NULL;
diff --git a/src/libnrtype/Layout-TNG-Compute.cpp b/src/libnrtype/Layout-TNG-Compute.cpp
index 973db0165..7eb53446f 100644
--- a/src/libnrtype/Layout-TNG-Compute.cpp
+++ b/src/libnrtype/Layout-TNG-Compute.cpp
@@ -854,6 +854,8 @@ void Layout::Calculator::BrokenSpan::setZero()
end_glyph_index = start_glyph_index = 0;
ends_with_whitespace = false;
each_whitespace_width = 0.0;
+ letter_spacing = 0.0;
+ word_spacing = 0.0;
}
template<typename T> void Layout::Calculator::ParagraphInfo::free_sequence(T &seq)
diff --git a/src/libnrtype/font-lister.cpp b/src/libnrtype/font-lister.cpp
index 39c557cc6..fad06cd00 100644
--- a/src/libnrtype/font-lister.cpp
+++ b/src/libnrtype/font-lister.cpp
@@ -650,7 +650,7 @@ void FontLister::fill_css(SPCSSAttr *css, Glib::ustring fontspec)
break;
#if PANGO_VERSION_CHECK(1,36,6)
case PANGO_WEIGHT_SEMILIGHT:
- sp_repr_css_set_property (css, "font-weight", "350");
+ sp_repr_css_set_property(css, "font-weight", "350");
break;
#endif
case PANGO_WEIGHT_BOOK:
diff --git a/src/libnrtype/nr-type-primitives.cpp b/src/libnrtype/nr-type-primitives.cpp
index 63a3abcc5..3ad4a3771 100644
--- a/src/libnrtype/nr-type-primitives.cpp
+++ b/src/libnrtype/nr-type-primitives.cpp
@@ -1,6 +1,4 @@
-#define __NR_TYPE_PRIMITIVES_C__
-
-/*
+/**
* Typeface and script library
*
* Authors:
@@ -12,26 +10,27 @@
/* This should be enough for approximately 10000 fonts */
#define NR_DICTSIZE 2777
-#include <stdlib.h>
+#include <cstdlib>
#include <string.h>
#include <glib.h>
+
#include "nr-type-primitives.h"
/**
* An entry in a list of key->value pairs
*/
struct NRTDEntry {
- NRTDEntry *next;
- const gchar *key;
- void *val;
+ NRTDEntry *next;
+ const gchar *key;
+ void *val;
};
/**
* Type Dictionary, consisting of size number of key-value entries
*/
struct NRTypeDict {
- unsigned int size;
- NRTDEntry **entries;
+ unsigned int size;
+ NRTDEntry **entries;
};
static NRTDEntry *nr_td_entry_new (void);
@@ -42,17 +41,17 @@ static NRTDEntry *nr_td_entry_new (void);
void
nr_name_list_release (NRNameList *list)
{
- if (list->destructor) {
- list->destructor (list);
- }
+ if (list->destructor) {
+ list->destructor (list);
+ }
}
void
nr_style_list_release (NRStyleList *list)
{
- if (list->destructor) {
- list->destructor (list);
- }
+ if (list->destructor) {
+ list->destructor (list);
+ }
}
/**
@@ -62,18 +61,18 @@ nr_style_list_release (NRStyleList *list)
NRTypeDict *
nr_type_dict_new (void)
{
- NRTypeDict *td;
- int i;
+ NRTypeDict *td;
+ int i;
- td = g_new (NRTypeDict, 1);
+ td = g_new (NRTypeDict, 1);
- td->size = NR_DICTSIZE;
- td->entries = g_new (NRTDEntry *, td->size);
- for (i = 0; i < NR_DICTSIZE; i++) {
- td->entries[i] = NULL;
- }
+ td->size = NR_DICTSIZE;
+ td->entries = g_new (NRTDEntry *, td->size);
+ for (i = 0; i < NR_DICTSIZE; i++) {
+ td->entries[i] = NULL;
+ }
- return td;
+ return td;
}
/**
@@ -82,15 +81,15 @@ nr_type_dict_new (void)
static unsigned int
nr_str_hash (const gchar *p)
{
- unsigned int h;
+ unsigned int h;
- h = *p;
+ h = *p;
- if (h != 0) {
- for (p += 1; *p; p++) h = (h << 5) - h + *p;
- }
+ if (h != 0) {
+ for (p += 1; *p; p++) h = (h << 5) - h + *p;
+ }
- return h;
+ return h;
}
/**
@@ -99,25 +98,25 @@ nr_str_hash (const gchar *p)
void
nr_type_dict_insert (NRTypeDict *td, const gchar *key, void *val)
{
- if (key) {
- NRTDEntry *tde;
- unsigned int hval;
-
- hval = nr_str_hash (key) % td->size;
-
- for (tde = td->entries[hval]; tde; tde = tde->next) {
- if (!strcmp (key, tde->key)) {
- tde->val = val;
- return;
- }
- }
-
- tde = nr_td_entry_new ();
- tde->next = td->entries[hval];
- tde->key = key;
- tde->val = val;
- td->entries[hval] = tde;
- }
+ if (key) {
+ NRTDEntry *tde;
+ unsigned int hval;
+
+ hval = nr_str_hash (key) % td->size;
+
+ for (tde = td->entries[hval]; tde; tde = tde->next) {
+ if (!strcmp (key, tde->key)) {
+ tde->val = val;
+ return;
+ }
+ }
+
+ tde = nr_td_entry_new ();
+ tde->next = td->entries[hval];
+ tde->key = key;
+ tde->val = val;
+ td->entries[hval] = tde;
+ }
}
/**
@@ -126,16 +125,16 @@ nr_type_dict_insert (NRTypeDict *td, const gchar *key, void *val)
void *
nr_type_dict_lookup (NRTypeDict *td, const gchar *key)
{
- if (key) {
- NRTDEntry *tde;
- unsigned int hval;
- hval = nr_str_hash (key) % td->size;
- for (tde = td->entries[hval]; tde; tde = tde->next) {
- if (!strcmp (key, tde->key)) return tde->val;
- }
- }
-
- return NULL;
+ if (key) {
+ NRTDEntry *tde;
+ unsigned int hval;
+ hval = nr_str_hash (key) % td->size;
+ for (tde = td->entries[hval]; tde; tde = tde->next) {
+ if (!strcmp (key, tde->key)) return tde->val;
+ }
+ }
+
+ return NULL;
}
#define NR_TDE_BLOCK_SIZE 32
@@ -148,20 +147,30 @@ static NRTDEntry *nr_tde_free_list;
static NRTDEntry *
nr_td_entry_new (void)
{
- NRTDEntry *tde;
+ NRTDEntry *tde;
- if (!nr_tde_free_list) {
- int i;
- nr_tde_free_list = g_new (NRTDEntry, NR_TDE_BLOCK_SIZE);
- for (i = 0; i < (NR_TDE_BLOCK_SIZE - 1); i++) {
- nr_tde_free_list[i].next = nr_tde_free_list + i + 1;
- }
- nr_tde_free_list[i].next = NULL;
- }
+ if (!nr_tde_free_list) {
+ int i;
+ nr_tde_free_list = g_new (NRTDEntry, NR_TDE_BLOCK_SIZE);
+ for (i = 0; i < (NR_TDE_BLOCK_SIZE - 1); i++) {
+ nr_tde_free_list[i].next = nr_tde_free_list + i + 1;
+ }
+ nr_tde_free_list[i].next = NULL;
+ }
- tde = nr_tde_free_list;
- nr_tde_free_list = tde->next;
+ tde = nr_tde_free_list;
+ nr_tde_free_list = tde->next;
- return tde;
+ return tde;
}
+/*
+ Local Variables:
+ mode:c++
+ c-file-style:"stroustrup"
+ c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
+ indent-tabs-mode:nil
+ fill-column:99
+ End:
+*/
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8 :
diff --git a/src/libnrtype/nr-type-primitives.h b/src/libnrtype/nr-type-primitives.h
index 9bb181c4b..863803433 100644
--- a/src/libnrtype/nr-type-primitives.h
+++ b/src/libnrtype/nr-type-primitives.h
@@ -1,12 +1,12 @@
-#ifndef __NR_TYPE_PRIMITIVES_H__
-#define __NR_TYPE_PRIMITIVES_H__
+#ifndef SEEN_NR_TYPE_PRIMITIVES_H
+#define SEEN_NR_TYPE_PRIMITIVES_H
-/*
+/**
* Typeface and script library
*
* Authors:
* Lauris Kaplinski <lauris@kaplinski.com>
- * g++ port: Nathan Hurst <njh@mail.csse.monash.edu.au>
+ * c++ port: Nathan Hurst <njh@mail.csse.monash.edu.au>
*
* This code is in public domain
*/
@@ -47,4 +47,15 @@ void nr_type_dict_insert (NRTypeDict *td, const gchar *key, void *val);
void *nr_type_dict_lookup (NRTypeDict *td, const gchar *key);
-#endif
+#endif // !SEEN_NR_TYPE_PRIMITIVES_H
+
+/*
+ Local Variables:
+ mode:c++
+ c-file-style:"stroustrup"
+ c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
+ indent-tabs-mode:nil
+ fill-column:99
+ End:
+*/
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8 :
diff --git a/src/line-geometry.h b/src/line-geometry.h
index d7be9570c..a77d6e1f3 100644
--- a/src/line-geometry.h
+++ b/src/line-geometry.h
@@ -12,13 +12,14 @@
#ifndef SEEN_LINE_GEOMETRY_H
#define SEEN_LINE_GEOMETRY_H
+#include <2geom/point.h>
#include <boost/optional.hpp>
-#include "glib.h"
+
#include "axis-manip.h" // FIXME: This is only for Box3D::epsilon; move that to a better location
-#include "2geom/point.h"
#include "persp3d.h"
class SPDesktop;
+typedef unsigned int guint32;
namespace Box3D {
diff --git a/src/line-snapper.cpp b/src/line-snapper.cpp
index 930b7fca9..6122b133a 100644
--- a/src/line-snapper.cpp
+++ b/src/line-snapper.cpp
@@ -11,9 +11,10 @@
*/
#include <2geom/line.h>
+#include <cassert>
+
#include "line-snapper.h"
#include "snapped-line.h"
-//#include <gtk/gtk.h>
#include "snap.h"
Inkscape::LineSnapper::LineSnapper(SnapManager *sm, Geom::Coord const d) : Snapper(sm, d)
@@ -37,7 +38,7 @@ void Inkscape::LineSnapper::freeSnap(IntermSnapResults &isr,
Geom::Point const p1 = i->second; // point at guide/grid line
Geom::Point const p2 = p1 + Geom::rot90(i->first); // 2nd point at guide/grid line
// std::cout << " line through " << i->second << " with normal " << i->first;
- g_assert(i->first != Geom::Point(0,0)); // we cannot project on an linesegment of zero length
+ assert(i->first != Geom::Point(0,0)); // we cannot project on an linesegment of zero length
Geom::Point const p_proj = Geom::projection(p.getPoint(), Geom::Line(p1, p2));
Geom::Coord const dist = Geom::L2(p_proj - p.getPoint());
diff --git a/src/line-snapper.h b/src/line-snapper.h
index 4b165e0a5..b2fc3d389 100644
--- a/src/line-snapper.h
+++ b/src/line-snapper.h
@@ -12,10 +12,9 @@
#include "snapper.h"
-namespace Inkscape
-{
-class SnapCandidatePoint;
+namespace Inkscape {
+class SnapCandidatePoint;
/**
* Superclass for snappers to horizontal and vertical lines.
diff --git a/src/livarot/PathStroke.cpp b/src/livarot/PathStroke.cpp
index 50c335176..6ec7fa209 100644
--- a/src/livarot/PathStroke.cpp
+++ b/src/livarot/PathStroke.cpp
@@ -748,12 +748,12 @@ void Path::RecRound(Shape *dest, int sNo, int eNo, // start and end index
}
/*
- Local Variables:
-mode:c++
-c-file-style:"stroustrup"
-c-file-offsets:((innamespace . 0)(inline-open . 0))
-indent-tabs-mode:nil
-fill-column:99
-End:
- */
-// vim: filetype=c++:expandtab:shiftwidth=4:tabstop=8:softtabstop=4 :
+ Local Variables:
+ mode:c++
+ c-file-style:"stroustrup"
+ c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
+ indent-tabs-mode:nil
+ fill-column:99
+ End:
+*/
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :
diff --git a/src/live_effects/CMakeLists.txt b/src/live_effects/CMakeLists.txt
index a5f50a69d..c8a02c810 100644
--- a/src/live_effects/CMakeLists.txt
+++ b/src/live_effects/CMakeLists.txt
@@ -2,8 +2,10 @@
set(live_effects_SRC
effect.cpp
lpe-angle_bisector.cpp
+ lpe-attach-path.cpp
lpe-bendpath.cpp
lpe-boolops.cpp
+ lpe-bounding-box.cpp
lpe-circle_3pts.cpp
lpe-circle_with_radius.cpp
lpe-clone-original.cpp
@@ -11,8 +13,12 @@ set(live_effects_SRC
lpe-copy_rotate.cpp
lpe-curvestitch.cpp
lpe-dynastroke.cpp
+ lpe-ellipse-5pts.cpp
lpe-envelope.cpp
lpe-extrude.cpp
+ lpe-fill-between-many.cpp
+ lpe-fill-between-strokes.cpp
+ lpe-fillet-chamfer.cpp
lpe-gears.cpp
lpe-interpolate.cpp
lpe-knot.cpp
@@ -25,15 +31,20 @@ set(live_effects_SRC
lpe-patternalongpath.cpp
lpe-perp_bisector.cpp
lpe-perspective_path.cpp
+ lpe-perspective-envelope.cpp
lpe-powerstroke.cpp
lpe-recursiveskeleton.cpp
lpe-rough-hatches.cpp
lpe-ruler.cpp
+ lpe-show_handles.cpp
+ lpe-simplify.cpp
# lpe-skeleton.cpp
lpe-sketch.cpp
lpe-spiro.cpp
+ lpe-roughen.cpp
lpe-tangent_to_curve.cpp
lpe-test-doEffect-stack.cpp
+ lpe-bspline.cpp
lpe-text_label.cpp
lpe-vonkoch.cpp
lpegroupbbox.cpp
@@ -44,14 +55,18 @@ set(live_effects_SRC
parameter/array.cpp
parameter/bool.cpp
+ parameter/filletchamferpointarray.cpp
parameter/parameter.cpp
parameter/path.cpp
parameter/originalpath.cpp
+ parameter/originalpatharray.cpp
parameter/path-reference.cpp
parameter/point.cpp
parameter/powerstrokepointarray.cpp
parameter/random.cpp
parameter/text.cpp
+ paramter/transformedpoint.cpp
+ parameter/togglebutton.cpp
parameter/unit.cpp
parameter/vector.cpp
@@ -61,8 +76,10 @@ set(live_effects_SRC
effect-enum.h
effect.h
lpe-angle_bisector.h
+ lpe-attach-path.h
lpe-bendpath.h
lpe-boolops.h
+ lpe-bounding-box.h
lpe-circle_3pts.h
lpe-circle_with_radius.h
lpe-clone-original.h
@@ -70,8 +87,12 @@ set(live_effects_SRC
lpe-copy_rotate.h
lpe-curvestitch.h
lpe-dynastroke.h
+ lpe-ellipse-5pts.h
lpe-envelope.h
lpe-extrude.h
+ lpe-fill-between-many.h
+ lpe-fill-between-strokes.h
+ lpe-fillet-chamfer.h
lpe-gears.h
lpe-interpolate.h
lpe-knot.h
@@ -84,16 +105,21 @@ set(live_effects_SRC
lpe-patternalongpath.h
lpe-perp_bisector.h
lpe-perspective_path.h
+ lpe-perspective-envelope.h
lpe-powerstroke.h
lpe-powerstroke-interpolators.h
lpe-recursiveskeleton.h
lpe-rough-hatches.h
lpe-ruler.h
+ lpe-simplify.h
+ lpe-show_handles.h
lpe-skeleton.h
lpe-sketch.h
lpe-spiro.h
+ lpe-roughen.h
lpe-tangent_to_curve.h
lpe-test-doEffect-stack.h
+ lpe-bspline.h
lpe-text_label.h
lpe-vonkoch.h
lpegroupbbox.h
@@ -104,15 +130,18 @@ set(live_effects_SRC
parameter/array.h
parameter/bool.h
+ parameter/filletchamferpointarray.h
parameter/enum.h
parameter/parameter.h
parameter/path-reference.h
parameter/path.h
parameter/originalpath.h
+ parameter/originalpatharray.h
parameter/point.h
parameter/powerstrokepointarray.h
parameter/random.h
parameter/text.h
+ parameter/togglebutton.h
parameter/unit.h
parameter/vector.h
diff --git a/src/live_effects/Makefile_insert b/src/live_effects/Makefile_insert
index 9c3c171f2..8f0a3ac57 100644
--- a/src/live_effects/Makefile_insert
+++ b/src/live_effects/Makefile_insert
@@ -32,14 +32,28 @@ ink_common_sources += \
live_effects/lpe-curvestitch.h \
live_effects/lpe-constructgrid.cpp \
live_effects/lpe-constructgrid.h \
+ live_effects/lpe-fillet-chamfer.cpp \
+ live_effects/lpe-fillet-chamfer.h \
live_effects/lpe-gears.cpp \
live_effects/lpe-gears.h \
live_effects/lpe-interpolate.cpp \
live_effects/lpe-interpolate.h \
+ live_effects/lpe-interpolate_points.cpp \
+ live_effects/lpe-interpolate_points.h \
live_effects/lpe-test-doEffect-stack.cpp \
live_effects/lpe-test-doEffect-stack.h \
+ live_effects/lpe-bspline.cpp \
+ live_effects/lpe-bspline.h \
live_effects/lpe-lattice.cpp \
live_effects/lpe-lattice.h \
+ live_effects/lpe-lattice2.cpp \
+ live_effects/lpe-lattice2.h \
+ live_effects/lpe-roughen.cpp \
+ live_effects/lpe-roughen.h \
+ live_effects/lpe-show_handles.cpp \
+ live_effects/lpe-show_handles.h \
+ live_effects/lpe-simplify.cpp \
+ live_effects/lpe-simplify.h \
live_effects/lpe-envelope.cpp \
live_effects/lpe-envelope.h \
live_effects/lpe-spiro.cpp \
@@ -56,6 +70,8 @@ ink_common_sources += \
live_effects/lpe-circle_with_radius.h \
live_effects/lpe-perspective_path.cpp \
live_effects/lpe-perspective_path.h \
+ live_effects/lpe-perspective-envelope.cpp \
+ live_effects/lpe-perspective-envelope.h \
live_effects/lpe-mirror_symmetry.cpp \
live_effects/lpe-mirror_symmetry.h \
live_effects/lpe-circle_3pts.cpp \
@@ -82,4 +98,20 @@ ink_common_sources += \
live_effects/lpe-path_length.cpp \
live_effects/lpe-path_length.h \
live_effects/lpe-line_segment.cpp \
- live_effects/lpe-line_segment.h
+ live_effects/lpe-line_segment.h \
+ live_effects/lpe-bounding-box.cpp \
+ live_effects/lpe-bounding-box.h \
+ live_effects/lpe-attach-path.cpp \
+ live_effects/lpe-attach-path.h \
+ live_effects/lpe-fill-between-strokes.cpp \
+ live_effects/lpe-fill-between-strokes.h \
+ live_effects/lpe-fill-between-many.cpp \
+ live_effects/lpe-fill-between-many.h \
+ live_effects/lpe-ellipse_5pts.cpp \
+ live_effects/lpe-ellipse_5pts.h \
+ live_effects/pathoutlineprovider.cpp \
+ live_effects/pathoutlineprovider.h \
+ live_effects/lpe-jointype.cpp \
+ live_effects/lpe-jointype.h \
+ live_effects/lpe-taperstroke.cpp \
+ live_effects/lpe-taperstroke.h
diff --git a/src/live_effects/effect-enum.h b/src/live_effects/effect-enum.h
index 43af33b53..383eec19e 100644
--- a/src/live_effects/effect-enum.h
+++ b/src/live_effects/effect-enum.h
@@ -28,6 +28,10 @@ enum EffectType {
PERSPECTIVE_PATH,
SPIRO,
LATTICE,
+ LATTICE2,
+ ROUGHEN,
+ SHOW_HANDLES,
+ SIMPLIFY,
ENVELOPE,
CONSTRUCT_GRID,
PERP_BISECTOR,
@@ -41,15 +45,26 @@ enum EffectType {
RULER,
BOOLOPS,
INTERPOLATE,
+ INTERPOLATE_POINTS,
TEXT_LABEL,
PATH_LENGTH,
LINE_SEGMENT,
DOEFFECTSTACK_TEST,
+ BSPLINE,
DYNASTROKE,
RECURSIVE_SKELETON,
EXTRUDE,
POWERSTROKE,
CLONE_ORIGINAL,
+ ATTACH_PATH,
+ FILL_BETWEEN_STROKES,
+ FILL_BETWEEN_MANY,
+ ELLIPSE_5PTS,
+ BOUNDING_BOX,
+ JOIN_TYPE,
+ TAPER_STROKE,
+ PERSPECTIVE_ENVELOPE,
+ FILLET_CHAMFER,
INVALID_LPE // This must be last (I made it such that it is not needed anymore I think..., Don't trust on it being last. - johan)
};
diff --git a/src/live_effects/effect.cpp b/src/live_effects/effect.cpp
index 4c5e21194..1a64defd9 100644
--- a/src/live_effects/effect.cpp
+++ b/src/live_effects/effect.cpp
@@ -5,6 +5,8 @@
* Released under GNU GPL, read the file 'COPYING' for more information
*/
+//#define LPE_ENABLE_TEST_EFFECTS //uncomment for toy effects
+
#ifdef HAVE_CONFIG_H
# include "config.h"
#endif
@@ -23,8 +25,13 @@
#include "live_effects/lpe-curvestitch.h"
#include "live_effects/lpe-circle_with_radius.h"
#include "live_effects/lpe-perspective_path.h"
+#include "live_effects/lpe-perspective-envelope.h"
#include "live_effects/lpe-spiro.h"
#include "live_effects/lpe-lattice.h"
+#include "live_effects/lpe-lattice2.h"
+#include "live_effects/lpe-roughen.h"
+#include "live_effects/lpe-show_handles.h"
+#include "live_effects/lpe-simplify.h"
#include "live_effects/lpe-envelope.h"
#include "live_effects/lpe-constructgrid.h"
#include "live_effects/lpe-perp_bisector.h"
@@ -38,6 +45,7 @@
#include "live_effects/lpe-ruler.h"
#include "live_effects/lpe-boolops.h"
#include "live_effects/lpe-interpolate.h"
+#include "live_effects/lpe-interpolate_points.h"
#include "live_effects/lpe-text_label.h"
#include "live_effects/lpe-path_length.h"
#include "live_effects/lpe-line_segment.h"
@@ -45,6 +53,15 @@
#include "live_effects/lpe-extrude.h"
#include "live_effects/lpe-powerstroke.h"
#include "live_effects/lpe-clone-original.h"
+#include "live_effects/lpe-bspline.h"
+#include "live_effects/lpe-attach-path.h"
+#include "live_effects/lpe-fill-between-strokes.h"
+#include "live_effects/lpe-fill-between-many.h"
+#include "live_effects/lpe-ellipse_5pts.h"
+#include "live_effects/lpe-bounding-box.h"
+#include "live_effects/lpe-jointype.h"
+#include "live_effects/lpe-taperstroke.h"
+#include "live_effects/lpe-fillet-chamfer.h"
#include "xml/node-event-vector.h"
#include "sp-object.h"
@@ -57,7 +74,7 @@
#include "xml/document.h"
#include <glibmm/i18n.h>
#include "ui/tools/pen-tool.h"
-#include "tools-switch.h"
+#include "ui/tools-switch.h"
#include "message-stack.h"
#include "desktop.h"
#include "knotholder.h"
@@ -103,7 +120,7 @@ const Util::EnumData<EffectType> LPETypeData[] = {
{TEXT_LABEL, N_("Text label"), "text_label"},
#endif
/* 0.46 */
- {BEND_PATH, N_("Bend"), "bend_path"},
+ {BEND_PATH, N_("Bend"), "bend_path"},
{GEARS, N_("Gears"), "gears"},
{PATTERN_ALONG_PATH, N_("Pattern Along Path"), "skeletal"}, // for historic reasons, this effect is called skeletal(strokes) in Inkscape:SVG
{CURVE_STITCH, N_("Stitch Sub-Paths"), "curvestitching"},
@@ -117,9 +134,27 @@ const Util::EnumData<EffectType> LPETypeData[] = {
{ROUGH_HATCHES, N_("Hatches (rough)"), "rough_hatches"},
{SKETCH, N_("Sketch"), "sketch"},
{RULER, N_("Ruler"), "ruler"},
-/* 0.49 */
- {POWERSTROKE, N_("Power stroke"), "powerstroke"},
- {CLONE_ORIGINAL, N_("Clone original path"), "clone_original"},
+/* 0.91 */
+ {POWERSTROKE, N_("Power stroke"), "powerstroke"},
+ {CLONE_ORIGINAL, N_("Clone original path"), "clone_original"},
+/* EXPERIMENTAL */
+ {SHOW_HANDLES, N_("Show handles"), "show_handles"},
+ {ROUGHEN, N_("Roughen"), "roughen"},
+ {BSPLINE, N_("BSpline"), "bspline"},
+ {JOIN_TYPE, N_("Join type"), "join_type"},
+ {TAPER_STROKE, N_("Taper stroke"), "taper_stroke"},
+/* Ponyscape */
+ {ATTACH_PATH, N_("Attach path"), "attach_path"},
+ {FILL_BETWEEN_STROKES, N_("Fill between strokes"), "fill_between_strokes"},
+ {FILL_BETWEEN_MANY, N_("Fill between many"), "fill_between_many"},
+ {ELLIPSE_5PTS, N_("Ellipse by 5 points"), "ellipse_5pts"},
+ {BOUNDING_BOX, N_("Bounding Box"), "bounding_box"},
+/* 0.91 */
+ {SIMPLIFY, N_("Simplify"), "simplify"},
+ {LATTICE2, N_("Lattice Deformation 2"), "lattice2"},
+ {PERSPECTIVE_ENVELOPE, N_("Perspective/Envelope"), "perspective-envelope"},
+ {FILLET_CHAMFER, N_("Fillet/Chamfer"), "fillet-chamfer"},
+ {INTERPOLATE_POINTS, N_("Interpolate points"), "interpolate_points"},
};
const Util::EnumDataConverter<EffectType> LPETypeConverter(LPETypeData, sizeof(LPETypeData)/sizeof(*LPETypeData));
@@ -216,6 +251,9 @@ Effect::New(EffectType lpenr, LivePathEffectObject *lpeobj)
case INTERPOLATE:
neweffect = static_cast<Effect*> ( new LPEInterpolate(lpeobj) );
break;
+ case INTERPOLATE_POINTS:
+ neweffect = static_cast<Effect*> ( new LPEInterpolatePoints(lpeobj) );
+ break;
case TEXT_LABEL:
neweffect = static_cast<Effect*> ( new LPETextLabel(lpeobj) );
break;
@@ -228,6 +266,9 @@ Effect::New(EffectType lpenr, LivePathEffectObject *lpeobj)
case DOEFFECTSTACK_TEST:
neweffect = static_cast<Effect*> ( new LPEdoEffectStackTest(lpeobj) );
break;
+ case BSPLINE:
+ neweffect = static_cast<Effect*> ( new LPEBSpline(lpeobj) );
+ break;
case DYNASTROKE:
neweffect = static_cast<Effect*> ( new LPEDynastroke(lpeobj) );
break;
@@ -243,8 +284,47 @@ Effect::New(EffectType lpenr, LivePathEffectObject *lpeobj)
case CLONE_ORIGINAL:
neweffect = static_cast<Effect*> ( new LPECloneOriginal(lpeobj) );
break;
+ case ATTACH_PATH:
+ neweffect = static_cast<Effect*> ( new LPEAttachPath(lpeobj) );
+ break;
+ case FILL_BETWEEN_STROKES:
+ neweffect = static_cast<Effect*> ( new LPEFillBetweenStrokes(lpeobj) );
+ break;
+ case FILL_BETWEEN_MANY:
+ neweffect = static_cast<Effect*> ( new LPEFillBetweenMany(lpeobj) );
+ break;
+ case ELLIPSE_5PTS:
+ neweffect = static_cast<Effect*> ( new LPEEllipse5Pts(lpeobj) );
+ break;
+ case BOUNDING_BOX:
+ neweffect = static_cast<Effect*> ( new LPEBoundingBox(lpeobj) );
+ break;
+ case JOIN_TYPE:
+ neweffect = static_cast<Effect*> ( new LPEJoinType(lpeobj) );
+ break;
+ case TAPER_STROKE:
+ neweffect = static_cast<Effect*> ( new LPETaperStroke(lpeobj) );
+ break;
+ case SIMPLIFY:
+ neweffect = static_cast<Effect*> ( new LPESimplify(lpeobj) );
+ break;
+ case LATTICE2:
+ neweffect = static_cast<Effect*> ( new LPELattice2(lpeobj) );
+ break;
+ case PERSPECTIVE_ENVELOPE:
+ neweffect = static_cast<Effect*> ( new LPEPerspectiveEnvelope(lpeobj) );
+ break;
+ case FILLET_CHAMFER:
+ neweffect = static_cast<Effect*> ( new LPEFilletChamfer(lpeobj) );
+ break;
+ case ROUGHEN:
+ neweffect = static_cast<Effect*> ( new LPERoughen(lpeobj) );
+ break;
+ case SHOW_HANDLES:
+ neweffect = static_cast<Effect*> ( new LPEShowHandles(lpeobj) );
+ break;
default:
- g_warning("LivePathEffect::Effect::New called with invalid patheffect type (%d)", lpenr);
+ g_warning("LivePathEffect::Effect::New called with invalid patheffect type (%d)", lpenr);
neweffect = NULL;
break;
}
@@ -327,6 +407,33 @@ Effect::doBeforeEffect (SPLPEItem const*/*lpeitem*/)
//Do nothing for simple effects
}
+void Effect::doAfterEffect (SPLPEItem const* /*lpeitem*/)
+{
+}
+
+void Effect::doOnRemove (SPLPEItem const* /*lpeitem*/)
+{
+}
+
+//secret impl methods (shhhh!)
+void Effect::doOnApply_impl(SPLPEItem const* lpeitem)
+{
+ sp_lpe_item = const_cast<SPLPEItem *>(lpeitem);
+ /*sp_curve = SP_SHAPE(sp_lpe_item)->getCurve();
+ pathvector_before_effect = sp_curve->get_pathvector();*/
+ doOnApply(lpeitem);
+}
+
+void Effect::doBeforeEffect_impl(SPLPEItem const* lpeitem)
+{
+ sp_lpe_item = const_cast<SPLPEItem *>(lpeitem);
+ //printf("(SPLPEITEM*) %p\n", sp_lpe_item);
+ sp_curve = SP_SHAPE(sp_lpe_item)->getCurve();
+ pathvector_before_effect = sp_curve->get_pathvector();
+
+ doBeforeEffect(lpeitem);
+}
+
/**
* Effects can have a parameter path set before they are applied by accepting a nonzero number of
* mouse clicks. This method activates the pen context, which waits for the specified number of
@@ -494,11 +601,6 @@ Effect::getCanvasIndicators(SPLPEItem const* lpeitem)
{
std::vector<Geom::PathVector> hp_vec;
- if (!SP_IS_SHAPE(lpeitem)) {
-// g_print ("How to handle helperpaths for non-shapes?\n"); // non-shapes are for example SPGroups.
- return hp_vec;
- }
-
// add indicators provided by the effect itself
addCanvasIndicators(lpeitem, hp_vec);
diff --git a/src/live_effects/effect.h b/src/live_effects/effect.h
index 1da9b4cc9..a486e8491 100644
--- a/src/live_effects/effect.h
+++ b/src/live_effects/effect.h
@@ -53,8 +53,16 @@ public:
EffectType effectType() const;
+ //basically, to get this method called before the derived classes, a bit
+ //of indirection is needed. We first call these methods, then the below.
+ void doOnApply_impl(SPLPEItem const* lpeitem);
+ void doBeforeEffect_impl(SPLPEItem const* lpeitem);
+
virtual void doOnApply (SPLPEItem const* lpeitem);
virtual void doBeforeEffect (SPLPEItem const* lpeitem);
+
+ virtual void doAfterEffect (SPLPEItem const* lpeitem);
+ virtual void doOnRemove (SPLPEItem const* lpeitem);
void writeParamsToSVG();
@@ -101,6 +109,7 @@ public:
Inkscape::XML::Node * getRepr();
SPDocument * getSPDoc();
LivePathEffectObject * getLPEObj() {return lpeobj;};
+ LivePathEffectObject const * getLPEObj() const {return lpeobj;};
Parameter * getParameter(const char * key);
void readallParameters(Inkscape::XML::Node const* repr);
@@ -146,6 +155,9 @@ protected:
// instead of normally 'splitting' the path into continuous pwd2 paths and calling doEffect_pwd2 for each.
bool concatenate_before_pwd2;
+ SPLPEItem * sp_lpe_item; // these get stored in doBeforeEffect_impl, and derived classes may do as they please with them.
+ SPCurve * sp_curve;
+ std::vector<Geom::Path> pathvector_before_effect;
private:
bool provides_own_flash_paths; // if true, the standard flash path is suppressed
diff --git a/src/live_effects/lpe-attach-path.cpp b/src/live_effects/lpe-attach-path.cpp
new file mode 100644
index 000000000..768c66ee2
--- /dev/null
+++ b/src/live_effects/lpe-attach-path.cpp
@@ -0,0 +1,198 @@
+/*
+ * Copyright (C) Theodore Janeczko 2012 <flutterguy317@gmail.com>
+ *
+ * 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-item.h"
+#include "2geom/path.h"
+#include "sp-shape.h"
+#include "sp-text.h"
+#include "2geom/bezier-curve.h"
+#include "2geom/path-sink.h"
+#include "parameter/parameter.h"
+#include "live_effects/parameter/point.h"
+#include "parameter/originalpath.h"
+#include "2geom/affine.h"
+
+namespace Inkscape {
+namespace LivePathEffect {
+
+LPEAttachPath::LPEAttachPath(LivePathEffectObject *lpeobject) :
+ Effect(lpeobject),
+ start_path(_("Start path:"), _("Path to attach to the start of this path"), "startpath", &wr, this),
+ start_path_position(_("Start path position:"), _("Position to attach path start to"), "startposition", &wr, this, 0.0),
+ start_path_curve_start(_("Start path curve start:"), _("Starting curve"), "startcurvestart", &wr, this, Geom::Point(20,0)/*, true*/),
+ start_path_curve_end(_("Start path curve end:"), _("Ending curve"), "startcurveend", &wr, this, Geom::Point(20,0)/*, true*/),
+ end_path(_("End path:"), _("Path to attach to the end of this path"), "endpath", &wr, this),
+ end_path_position(_("End path position:"), _("Position to attach path end to"), "endposition", &wr, this, 0.0),
+ end_path_curve_start(_("End path curve start:"), _("Starting curve"), "endcurvestart", &wr, this, Geom::Point(20,0)/*, true*/),
+ end_path_curve_end(_("End path curve end:"), _("Ending curve"), "endcurveend", &wr, this, Geom::Point(20,0)/*, true*/)
+{
+ registerParameter(&start_path);
+ registerParameter(&start_path_position);
+ registerParameter(&start_path_curve_start);
+ registerParameter(&start_path_curve_end);
+
+ registerParameter(&end_path);
+ registerParameter(&end_path_position);
+ registerParameter(&end_path_curve_start);
+ registerParameter(&end_path_curve_end);
+
+ //perceived_path = true;
+ show_orig_path = true;
+ curve_start_previous_origin = start_path_curve_end.getOrigin();
+ curve_end_previous_origin = end_path_curve_end.getOrigin();
+}
+
+LPEAttachPath::~LPEAttachPath()
+{
+
+}
+
+void LPEAttachPath::resetDefaults(SPItem const * /*item*/)
+{
+ curve_start_previous_origin = start_path_curve_end.getOrigin();
+ curve_end_previous_origin = end_path_curve_end.getOrigin();
+}
+
+void LPEAttachPath::doEffect (SPCurve * curve)
+{
+ std::vector<Geom::Path> this_pathv = curve->get_pathvector();
+ if (sp_lpe_item && !this_pathv.empty()) {
+ Geom::Path p = Geom::Path(this_pathv.front().initialPoint());
+
+ bool set_start_end = start_path_curve_end.getOrigin() != curve_start_previous_origin;
+ bool set_end_end = end_path_curve_end.getOrigin() != curve_end_previous_origin;
+
+ if (start_path.linksToPath()) {
+
+ std::vector<Geom::Path> linked_pathv = start_path.get_pathvector();
+ Geom::Affine linkedtransform = start_path.getObject()->getRelativeTransform(sp_lpe_item);
+
+ if ( !linked_pathv.empty() )
+ {
+ Geom::Path transformedpath = linked_pathv.front() * linkedtransform;
+ start_path_curve_start.setOrigin(this_pathv.front().initialPoint());
+
+ std::vector<Geom::Point> derivs = this_pathv.front().front().pointAndDerivatives(0, 3);
+
+ for (unsigned deriv_n = 1; deriv_n < derivs.size(); deriv_n++) {
+ Geom::Coord length = derivs[deriv_n].length();
+ if ( ! Geom::are_near(length, 0) ) {
+ if (set_start_end) {
+ start_path_position.param_set_value(transformedpath.nearestPoint(start_path_curve_end.getOrigin()));
+ }
+
+ if (start_path_position > transformedpath.size()) {
+ start_path_position.param_set_value(transformedpath.size());
+ } else if (start_path_position < 0) {
+ start_path_position.param_set_value(0);
+ }
+ const Geom::Curve *c = start_path_position >= transformedpath.size() ? &transformedpath.back() : &transformedpath.at_index((int)start_path_position);
+
+ std::vector<Geom::Point> derivs_2 = c->pointAndDerivatives(start_path_position >= transformedpath.size() ? 1 : (start_path_position - (int)start_path_position), 3);
+ for (unsigned deriv_n_2 = 1; deriv_n_2 < derivs_2.size(); deriv_n_2++) {
+ Geom::Coord length_2 = derivs[deriv_n_2].length();
+ if ( ! Geom::are_near(length_2, 0) ) {
+ start_path_curve_end.setOrigin(derivs_2[0]);
+ curve_start_previous_origin = start_path_curve_end.getOrigin();
+
+ double startangle = atan2(start_path_curve_start.getVector().y(), start_path_curve_start.getVector().x());
+ double endangle = atan2(start_path_curve_end.getVector().y(), start_path_curve_end.getVector().x());
+ double startderiv = atan2(derivs[deriv_n].y(), derivs[deriv_n].x());
+ double endderiv = atan2(derivs_2[deriv_n_2].y(), derivs_2[deriv_n_2].x());
+ Geom::Point pt1 = Geom::Point(start_path_curve_start.getVector().length() * cos(startangle + startderiv), start_path_curve_start.getVector().length() * sin(startangle + startderiv));
+ Geom::Point pt2 = Geom::Point(start_path_curve_end.getVector().length() * cos(endangle + endderiv), start_path_curve_end.getVector().length() * sin(endangle + endderiv));
+ p = Geom::Path(derivs_2[0]);
+ p.appendNew<Geom::CubicBezier>(-pt2 + derivs_2[0], -pt1 + this_pathv.front().initialPoint(), this_pathv.front().initialPoint());
+ break;
+
+ }
+ }
+ break;
+ }
+ }
+ }
+ }
+
+ p.append(this_pathv.front());
+
+ if (end_path.linksToPath()) {
+
+ std::vector<Geom::Path> linked_pathv = end_path.get_pathvector();
+ Geom::Affine linkedtransform = end_path.getObject()->getRelativeTransform(sp_lpe_item);
+
+ if ( !linked_pathv.empty() )
+ {
+ Geom::Path transformedpath = linked_pathv.front() * linkedtransform;
+ Geom::Curve * last_seg_reverse = this_pathv.front().back().reverse();
+
+ end_path_curve_start.setOrigin(last_seg_reverse->initialPoint());
+
+ std::vector<Geom::Point> derivs = last_seg_reverse->pointAndDerivatives(0, 3);
+ for (unsigned deriv_n = 1; deriv_n < derivs.size(); deriv_n++) {
+ Geom::Coord length = derivs[deriv_n].length();
+ if ( ! Geom::are_near(length, 0) ) {
+ if (set_end_end) {
+ end_path_position.param_set_value(transformedpath.nearestPoint(end_path_curve_end.getOrigin()));
+ }
+
+ if (end_path_position > transformedpath.size()) {
+ end_path_position.param_set_value(transformedpath.size());
+ } else if (end_path_position < 0) {
+ end_path_position.param_set_value(0);
+ }
+ const Geom::Curve *c = end_path_position >= transformedpath.size() ? &transformedpath.back() : &transformedpath.at_index((int)end_path_position);
+
+ std::vector<Geom::Point> derivs_2 = c->pointAndDerivatives(end_path_position >= transformedpath.size() ? 1 : (end_path_position - (int)end_path_position), 3);
+ for (unsigned deriv_n_2 = 1; deriv_n_2 < derivs_2.size(); deriv_n_2++) {
+ Geom::Coord length_2 = derivs[deriv_n_2].length();
+ if ( ! Geom::are_near(length_2, 0) ) {
+
+ end_path_curve_end.setOrigin(derivs_2[0]);
+ curve_end_previous_origin = end_path_curve_end.getOrigin();
+
+ double startangle = atan2(end_path_curve_start.getVector().y(), end_path_curve_start.getVector().x());
+ double endangle = atan2(end_path_curve_end.getVector().y(), end_path_curve_end.getVector().x());
+ double startderiv = atan2(derivs[deriv_n].y(), derivs[deriv_n].x());
+ double endderiv = atan2(derivs_2[deriv_n_2].y(), derivs_2[deriv_n_2].x());
+ Geom::Point pt1 = Geom::Point(end_path_curve_start.getVector().length() * cos(startangle + startderiv), end_path_curve_start.getVector().length() * sin(startangle + startderiv));
+ Geom::Point pt2 = Geom::Point(end_path_curve_end.getVector().length() * cos(endangle + endderiv), end_path_curve_end.getVector().length() * sin(endangle + endderiv));
+ p.appendNew<Geom::CubicBezier>(-pt1 + this_pathv.front().finalPoint(), -pt2 + derivs_2[0], derivs_2[0]);
+
+ break;
+
+ }
+ }
+ break;
+ }
+ }
+ delete last_seg_reverse;
+ }
+ }
+ Geom::PathVector outvector;
+ outvector.push_back(p);
+ curve->set_pathvector(outvector);
+ }
+}
+
+} // namespace LivePathEffect
+} /* namespace Inkscape */
+
+/*
+ Local Variables:
+ mode:c++
+ c-file-style:"stroustrup"
+ c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
+ indent-tabs-mode:nil
+ fill-column:99
+ End:
+*/
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4 :
diff --git a/src/live_effects/lpe-attach-path.h b/src/live_effects/lpe-attach-path.h
new file mode 100644
index 000000000..1d6c590d1
--- /dev/null
+++ b/src/live_effects/lpe-attach-path.h
@@ -0,0 +1,52 @@
+#ifndef INKSCAPE_LPE_ATTACH_PATH_H
+#define INKSCAPE_LPE_ATTACH_PATH_H
+
+/*
+ * Inkscape::LPEAttachPath
+ *
+ * Copyright (C) Ted Janeczko 2012 <flutterguy317@gmail.com>
+ *
+ * Released under GNU GPL, read the file 'COPYING' for more information
+ */
+
+#include "live_effects/effect.h"
+#include "live_effects/parameter/parameter.h"
+#include "live_effects/parameter/point.h"
+#include "live_effects/parameter/originalpath.h"
+#include "live_effects/parameter/vector.h"
+#include "live_effects/parameter/bool.h"
+#include "live_effects/parameter/transformedpoint.h"
+
+namespace Inkscape {
+namespace LivePathEffect {
+
+class LPEAttachPath : public Effect {
+public:
+ LPEAttachPath(LivePathEffectObject *lpeobject);
+ virtual ~LPEAttachPath();
+
+ virtual void doEffect (SPCurve * curve);
+ virtual void resetDefaults(SPItem const * item);
+
+private:
+ LPEAttachPath(const LPEAttachPath&);
+ LPEAttachPath& operator=(const LPEAttachPath&);
+
+ Geom::Point curve_start_previous_origin;
+ Geom::Point curve_end_previous_origin;
+
+ OriginalPathParam start_path;
+ ScalarParam start_path_position;
+ TransformedPointParam start_path_curve_start;
+ VectorParam start_path_curve_end;
+
+ OriginalPathParam end_path;
+ ScalarParam end_path_position;
+ TransformedPointParam end_path_curve_start;
+ VectorParam end_path_curve_end;
+};
+
+}; //namespace LivePathEffect
+}; //namespace Inkscape
+
+#endif
diff --git a/src/live_effects/lpe-bendpath.cpp b/src/live_effects/lpe-bendpath.cpp
index eaf9fe4a6..33171b184 100644
--- a/src/live_effects/lpe-bendpath.cpp
+++ b/src/live_effects/lpe-bendpath.cpp
@@ -76,6 +76,9 @@ LPEBendPath::doBeforeEffect (SPLPEItem const* lpeitem)
{
// get the item bounding box
original_bbox(lpeitem);
+ SPLPEItem * item = const_cast<SPLPEItem*>(lpeitem);
+ item->apply_to_clippath(item);
+ item->apply_to_mask(item);
}
Geom::Piecewise<Geom::D2<Geom::SBasis> >
diff --git a/src/live_effects/lpe-bounding-box.cpp b/src/live_effects/lpe-bounding-box.cpp
new file mode 100644
index 000000000..bafd5e70e
--- /dev/null
+++ b/src/live_effects/lpe-bounding-box.cpp
@@ -0,0 +1,67 @@
+/*
+ * Copyright (C) Theodore Janeczko 2012 <flutterguy317@gmail.com>
+ *
+ * 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-item.h"
+#include "2geom/path.h"
+#include "sp-shape.h"
+#include "sp-text.h"
+#include "2geom/bezier-curve.h"
+#include "lpe-bounding-box.h"
+
+namespace Inkscape {
+namespace LivePathEffect {
+
+LPEBoundingBox::LPEBoundingBox(LivePathEffectObject *lpeobject) :
+ Effect(lpeobject),
+ linked_path(_("Linked path:"), _("Path from which to take the original path data"), "linkedpath", &wr, this),
+ visual_bounds(_("Visual Bounds"), _("Uses the visual bounding box"), "visualbounds", &wr, this)
+{
+ registerParameter( dynamic_cast<Parameter *>(&linked_path) );
+ registerParameter( dynamic_cast<Parameter *>(&visual_bounds) );
+ //perceived_path = true;
+}
+
+LPEBoundingBox::~LPEBoundingBox()
+{
+
+}
+
+void LPEBoundingBox::doEffect (SPCurve * curve)
+{
+ if (curve) {
+ if ( linked_path.linksToPath() && linked_path.getObject() ) {
+ SPItem * item = linked_path.getObject();
+ Geom::OptRect bbox = visual_bounds.get_value() ? item->visualBounds() : item->geometricBounds();
+ Geom::Path p(Geom::Point(bbox->left(), bbox->top()));
+ p.appendNew<Geom::LineSegment>(Geom::Point(bbox->right(), bbox->top()));
+ p.appendNew<Geom::LineSegment>(Geom::Point(bbox->right(), bbox->bottom()));
+ p.appendNew<Geom::LineSegment>(Geom::Point(bbox->left(), bbox->bottom()));
+ p.appendNew<Geom::LineSegment>(Geom::Point(bbox->left(), bbox->top()));
+ std::vector<Geom::Path> out;
+ out.push_back(p);
+ curve->set_pathvector(out);
+ }
+ }
+}
+
+} // namespace LivePathEffect
+} /* namespace Inkscape */
+
+/*
+ Local Variables:
+ mode:c++
+ c-file-style:"stroustrup"
+ c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
+ indent-tabs-mode:nil
+ fill-column:99
+ End:
+*/
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4 :
diff --git a/src/live_effects/lpe-bounding-box.h b/src/live_effects/lpe-bounding-box.h
new file mode 100644
index 000000000..d028a20ac
--- /dev/null
+++ b/src/live_effects/lpe-bounding-box.h
@@ -0,0 +1,37 @@
+#ifndef INKSCAPE_LPE_BOUNDING_BOX_H
+#define INKSCAPE_LPE_BOUNDING_BOX_H
+
+/*
+ * Inkscape::LPEFillBetweenStrokes
+ *
+ * Copyright (C) Theodore Janeczko 2012 <flutterguy317@gmail.com>
+ *
+ * Released under GNU GPL, read the file 'COPYING' for more information
+ */
+
+#include "live_effects/effect.h"
+#include "live_effects/parameter/originalpath.h"
+
+namespace Inkscape {
+namespace LivePathEffect {
+
+class LPEBoundingBox : public Effect {
+public:
+ LPEBoundingBox(LivePathEffectObject *lpeobject);
+ virtual ~LPEBoundingBox();
+
+ virtual void doEffect (SPCurve * curve);
+
+private:
+ OriginalPathParam linked_path;
+ BoolParam visual_bounds;
+
+private:
+ LPEBoundingBox(const LPEBoundingBox&);
+ LPEBoundingBox& operator=(const LPEBoundingBox&);
+};
+
+}; //namespace LivePathEffect
+}; //namespace Inkscape
+
+#endif
diff --git a/src/live_effects/lpe-bspline.cpp b/src/live_effects/lpe-bspline.cpp
new file mode 100644
index 000000000..b68799d08
--- /dev/null
+++ b/src/live_effects/lpe-bspline.cpp
@@ -0,0 +1,663 @@
+/*
+ * Released under GNU GPL, read the file 'COPYING' for more information
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <gtkmm.h>
+
+#if WITH_GLIBMM_2_32
+# include <glibmm/threads.h>
+#endif
+
+#include <glib.h>
+#include <glibmm/i18n.h>
+
+
+#include "display/curve.h"
+#include <2geom/bezier-curve.h>
+#include <2geom/point.h>
+#include "helper/geom-curves.h"
+#include "live_effects/lpe-bspline.h"
+#include "live_effects/lpeobject.h"
+#include "live_effects/parameter/parameter.h"
+#include "ui/widget/scalar.h"
+#include "ui/tool/node.h"
+#include "ui/tools/node-tool.h"
+#include "ui/tool/control-point-selection.h"
+#include "ui/tool/selectable-control-point.h"
+#include "selection.h"
+#include "xml/repr.h"
+#include "svg/svg.h"
+#include "sp-path.h"
+#include "style.h"
+#include "document-private.h"
+#include "document.h"
+#include "document-undo.h"
+#include "desktop-handles.h"
+#include "verbs.h"
+#include "sp-lpe-item.h"
+#include "sp-namedview.h"
+#include "display/sp-canvas.h"
+#include <typeinfo>
+#include <vector>
+#include "util/units.h"
+// For handling un-continuous paths:
+#include "message-stack.h"
+#include "inkscape.h"
+#include "desktop.h"
+
+using Inkscape::DocumentUndo;
+
+namespace Inkscape {
+namespace LivePathEffect {
+
+const double handleCubicGap = 0.01;
+const double noPower = 0.0;
+const double defaultStartPower = 0.3334;
+const double defaultEndPower = 0.6667;
+
+LPEBSpline::LPEBSpline(LivePathEffectObject *lpeobject)
+ : Effect(lpeobject),
+ // initialise your parameters here:
+ //testpointA(_("Test Point A"), _("Test A"), "ptA", &wr, this,
+ //Geom::Point(100,100)),
+ steps(_("Steps whith CTRL:"), _("Change number of steps whith CTRL pressed"), "steps", &wr, this, 2),
+ ignoreCusp(_("Ignore cusp nodes"), _("Change ignoring cusp nodes"), "ignoreCusp", &wr, this, true),
+ onlySelected(_("Change only selected nodes"), _("Change only selected nodes"), "onlySelected", &wr, this, false),
+ showHelper(_("Show helper paths"), _("Show helper paths"), "showHelper", &wr, this, false),
+ weight(_("Change weight:"), _("Change weight of the effect"), "weight", &wr, this, defaultStartPower)
+{
+ registerParameter(dynamic_cast<Parameter *>(&weight));
+ registerParameter(dynamic_cast<Parameter *>(&steps));
+ registerParameter(dynamic_cast<Parameter *>(&ignoreCusp));
+ registerParameter(dynamic_cast<Parameter *>(&onlySelected));
+ registerParameter(dynamic_cast<Parameter *>(&showHelper));
+
+ weight.param_set_range(noPower, 1);
+ weight.param_set_increments(0.1, 0.1);
+ weight.param_set_digits(4);
+
+ steps.param_set_range(1, 10);
+ steps.param_set_increments(1, 1);
+ steps.param_set_digits(0);
+}
+
+LPEBSpline::~LPEBSpline() {}
+
+void LPEBSpline::doBeforeEffect (SPLPEItem const* lpeitem)
+{
+ if(!hp.empty()){
+ hp.clear();
+ }
+}
+
+
+void LPEBSpline::createAndApply(const char *name, SPDocument *doc,
+ SPItem *item)
+{
+ if (!SP_IS_SHAPE(item)) {
+ g_warning("LPE BSpline can only be applied to shapes (not groups).");
+ } else {
+ // Path effect definition
+ Inkscape::XML::Document *xml_doc = doc->getReprDoc();
+ Inkscape::XML::Node *repr = xml_doc->createElement("inkscape:path-effect");
+ repr->setAttribute("effect", name);
+
+ doc->getDefs()->getRepr()
+ ->addChild(repr, NULL); // adds to <defs> and assigns the 'id' attribute
+ const gchar *repr_id = repr->attribute("id");
+ Inkscape::GC::release(repr);
+
+ gchar *href = g_strdup_printf("#%s", repr_id);
+ SP_LPE_ITEM(item)->addPathEffect(href, true);
+ g_free(href);
+ }
+}
+
+void LPEBSpline::doEffect(SPCurve *curve)
+{
+
+ if (curve->get_segment_count() < 1){
+ return;
+ }
+ // Make copy of old path as it is changed during processing
+ Geom::PathVector const original_pathv = curve->get_pathvector();
+ curve->reset();
+ double radiusHelperNodes = 6.0;
+ SPDesktop *desktop = SP_ACTIVE_DESKTOP;
+ if (desktop){
+ radiusHelperNodes /= SP_ACTIVE_DESKTOP->current_zoom();
+ SPNamedView *nv = sp_desktop_namedview(desktop);
+ radiusHelperNodes = Inkscape::Util::Quantity::convert(radiusHelperNodes, "px", nv->doc_units->abbr);
+ }
+ for (Geom::PathVector::const_iterator path_it = original_pathv.begin();
+ path_it != original_pathv.end(); ++path_it) {
+ if (path_it->empty())
+ continue;
+
+ Geom::Path::const_iterator curve_it1 = path_it->begin();
+ Geom::Path::const_iterator curve_it2 = ++(path_it->begin());
+ Geom::Path::const_iterator curve_endit = path_it->end_default();
+ SPCurve *nCurve = new SPCurve();
+ Geom::Point previousNode(0, 0);
+ Geom::Point node(0, 0);
+ Geom::Point pointAt1(0, 0);
+ Geom::Point pointAt2(0, 0);
+ Geom::Point nextPointAt1(0, 0);
+ Geom::D2<Geom::SBasis> SBasisIn;
+ Geom::D2<Geom::SBasis> SBasisOut;
+ Geom::D2<Geom::SBasis> SBasisHelper;
+ Geom::CubicBezier const *cubic = NULL;
+ if (path_it->closed()) {
+ // if the path is closed, maybe we have to stop a bit earlier because the
+ // closing line segment has zerolength.
+ const Geom::Curve &closingline =
+ path_it->back_closed(); // the closing line segment is always of type
+ // Geom::LineSegment.
+ if (are_near(closingline.initialPoint(), closingline.finalPoint())) {
+ // closingline.isDegenerate() did not work, because it only checks for
+ // *exact* zero length, which goes wrong for relative coordinates and
+ // rounding errors...
+ // the closing line segment has zero-length. So stop before that one!
+ curve_endit = path_it->end_open();
+ }
+ }
+ //Si la curva está cerrada calculamos el punto donde
+ //deveria estar el nodo BSpline de cierre/inicio de la curva
+ //en posible caso de que se cierre con una linea recta creando un nodo
+ //BSPline
+ nCurve->moveto(curve_it1->initialPoint());
+ //Recorremos todos los segmentos menos el último
+ while (curve_it1 != curve_endit) {
+ //previousPointAt3 = pointAt3;
+ //Calculamos los puntos que dividirían en tres segmentos iguales el path
+ //recto de entrada y de salida
+ SPCurve *in = new SPCurve();
+ in->moveto(curve_it1->initialPoint());
+ in->lineto(curve_it1->finalPoint());
+ cubic = dynamic_cast<Geom::CubicBezier const *>(&*curve_it1);
+ if (cubic) {
+ SBasisIn = in->first_segment()->toSBasis();
+ if(are_near((*cubic)[1],(*cubic)[0]) && !are_near((*cubic)[2],(*cubic)[3])) {
+ pointAt1 = SBasisIn.valueAt(defaultStartPower);
+ } else {
+ pointAt1 = SBasisIn.valueAt(Geom::nearest_point((*cubic)[1], *in->first_segment()));
+ }
+ if(are_near((*cubic)[2],(*cubic)[3]) && !are_near((*cubic)[1],(*cubic)[0])) {
+ pointAt2 = SBasisIn.valueAt(defaultEndPower);
+ } else {
+ pointAt2 = SBasisIn.valueAt(Geom::nearest_point((*cubic)[2], *in->first_segment()));
+ }
+ } else {
+ pointAt1 = in->first_segment()->initialPoint();
+ pointAt2 = in->first_segment()->finalPoint();
+ }
+ in->reset();
+ delete in;
+ if ( curve_it2 != curve_endit ) {
+ SPCurve *out = new SPCurve();
+ out->moveto(curve_it2->initialPoint());
+ out->lineto(curve_it2->finalPoint());
+ cubic = dynamic_cast<Geom::CubicBezier const *>(&*curve_it2);
+ if (cubic) {
+ SBasisOut = out->first_segment()->toSBasis();
+ if(are_near((*cubic)[1],(*cubic)[0]) && !are_near((*cubic)[2],(*cubic)[3])) {
+ nextPointAt1 = SBasisIn.valueAt(defaultStartPower);
+ } else {
+ nextPointAt1 = SBasisOut.valueAt(Geom::nearest_point((*cubic)[1], *out->first_segment()));
+ }
+ } else {
+ nextPointAt1 = out->first_segment()->initialPoint();
+ }
+ out->reset();
+ delete out;
+ }
+ if (path_it->closed() && curve_it2 == curve_endit) {
+ SPCurve *start = new SPCurve();
+ start->moveto(path_it->begin()->initialPoint());
+ start->lineto(path_it->begin()->finalPoint());
+ Geom::D2<Geom::SBasis> SBasisStart = start->first_segment()->toSBasis();
+ SPCurve *lineHelper = new SPCurve();
+ cubic = dynamic_cast<Geom::CubicBezier const *>(&*path_it->begin());
+ if (cubic) {
+ lineHelper->moveto(SBasisStart.valueAt(
+ Geom::nearest_point((*cubic)[1], *start->first_segment())));
+ } else {
+ lineHelper->moveto(start->first_segment()->initialPoint());
+ }
+ start->reset();
+ delete start;
+
+ SPCurve *end = new SPCurve();
+ end->moveto(curve_it1->initialPoint());
+ end->lineto(curve_it1->finalPoint());
+ Geom::D2<Geom::SBasis> SBasisEnd = end->first_segment()->toSBasis();
+ cubic = dynamic_cast<Geom::CubicBezier const *>(&*curve_it1);
+ if (cubic) {
+ lineHelper->lineto(SBasisEnd.valueAt(
+ Geom::nearest_point((*cubic)[2], *end->first_segment())));
+ } else {
+ lineHelper->lineto(end->first_segment()->finalPoint());
+ }
+ end->reset();
+ delete end;
+ SBasisHelper = lineHelper->first_segment()->toSBasis();
+ lineHelper->reset();
+ delete lineHelper;
+ node = SBasisHelper.valueAt(0.5);
+ nCurve->curveto(pointAt1, pointAt2, node);
+ nCurve->move_endpoints(node, node);
+ } else if ( curve_it2 == curve_endit) {
+ nCurve->curveto(pointAt1, pointAt2, curve_it1->finalPoint());
+ nCurve->move_endpoints(path_it->begin()->initialPoint(), curve_it1->finalPoint());
+ } else {
+ SPCurve *lineHelper = new SPCurve();
+ lineHelper->moveto(pointAt2);
+ lineHelper->lineto(nextPointAt1);
+ SBasisHelper = lineHelper->first_segment()->toSBasis();
+ lineHelper->reset();
+ delete lineHelper;
+ //almacenamos el punto del anterior bucle -o el de cierre- que nos hara de
+ //principio de curva
+ previousNode = node;
+ //Y este hará de final de curva
+ node = SBasisHelper.valueAt(0.5);
+ Geom::CubicBezier const *cubic2 = dynamic_cast<Geom::CubicBezier const *>(&*curve_it1);
+ if((cubic && are_near((*cubic)[0],(*cubic)[1])) || (cubic2 && are_near((*cubic2)[2],(*cubic2)[3]))) {
+ node = curve_it1->finalPoint();
+ }
+ nCurve->curveto(pointAt1, pointAt2, node);
+ }
+ if(!are_near(node,curve_it1->finalPoint()) && showHelper){
+ drawHandle(node, radiusHelperNodes);
+ }
+ //La curva BSpline se forma calculando el centro del segmanto de unión
+ //de el punto situado en las 2/3 partes de el segmento de entrada
+ //con el punto situado en la posición 1/3 del segmento de salida
+ //Estos dos puntos ademas estan posicionados en el lugas correspondiente
+ //de los manejadores de la curva
+ //aumentamos los valores para el siguiente paso en el bucle
+ ++curve_it1;
+ ++curve_it2;
+ }
+ //y cerramos la curva
+ if (path_it->closed()) {
+ nCurve->closepath_current();
+ }
+ curve->append(nCurve, false);
+ nCurve->reset();
+ delete nCurve;
+ }
+ if(showHelper){
+ Geom::PathVector const pathv = curve->get_pathvector();
+ hp.push_back(pathv[0]);
+ }
+}
+
+void
+LPEBSpline::drawHandle(Geom::Point p, double radiusHelperNodes)
+{
+ char const * svgd = "M 1,0.5 A 0.5,0.5 0 0 1 0.5,1 0.5,0.5 0 0 1 0,0.5 0.5,0.5 0 0 1 0.5,0 0.5,0.5 0 0 1 1,0.5 Z";
+ Geom::PathVector pathv = sp_svg_read_pathv(svgd);
+ Geom::Affine aff = Geom::Affine();
+ aff *= Geom::Scale(radiusHelperNodes);
+ pathv *= aff;
+ pathv += p - Geom::Point(0.5*radiusHelperNodes, 0.5*radiusHelperNodes);
+ hp.push_back(pathv[0]);
+}
+
+void
+LPEBSpline::addCanvasIndicators(SPLPEItem const */*lpeitem*/, std::vector<Geom::PathVector> &hp_vec)
+{
+ hp_vec.push_back(hp);
+}
+
+Gtk::Widget *LPEBSpline::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 (param->param_key == "weight") {
+ Gtk::HBox * buttons = Gtk::manage(new Gtk::HBox(true,0));
+ Gtk::Button *defaultWeight =
+ Gtk::manage(new Gtk::Button(Glib::ustring(_("Default weight"))));
+ defaultWeight->signal_clicked()
+ .connect(sigc::bind<Gtk::Widget *>(sigc::mem_fun(*this, &LPEBSpline::toDefaultWeight), widg));
+ buttons->pack_start(*defaultWeight, true, true, 2);
+ Gtk::Button *makeCusp =
+ Gtk::manage(new Gtk::Button(Glib::ustring(_("Make cusp"))));
+ makeCusp->signal_clicked()
+ .connect(sigc::bind<Gtk::Widget *>(sigc::mem_fun(*this, &LPEBSpline::toMakeCusp), widg));
+ buttons->pack_start(*makeCusp, true, true, 2);
+ vbox->pack_start(*buttons, true, true, 2);
+ }
+ if (param->param_key == "weight" || param->param_key == "steps") {
+ Inkscape::UI::Widget::Scalar *widgRegistered =
+ Gtk::manage(dynamic_cast<Inkscape::UI::Widget::Scalar *>(widg));
+ widgRegistered->signal_value_changed()
+ .connect(sigc::mem_fun(*this, &LPEBSpline::toWeight));
+ widg = dynamic_cast<Gtk::Widget *>(widgRegistered);
+ if (widg) {
+ Gtk::HBox * scalarParameter = dynamic_cast<Gtk::HBox *>(widg);
+ std::vector< Gtk::Widget* > childList = scalarParameter->get_children();
+ Gtk::Entry* entryWidg = dynamic_cast<Gtk::Entry *>(childList[1]);
+ entryWidg->set_width_chars(6);
+ }
+ }
+ if (param->param_key == "onlySelected") {
+ Gtk::CheckButton *widgRegistered =
+ Gtk::manage(dynamic_cast<Gtk::CheckButton *>(widg));
+ widg = dynamic_cast<Gtk::Widget *>(widgRegistered);
+ }
+ if (param->param_key == "ignoreCusp") {
+ Gtk::CheckButton *widgRegistered =
+ Gtk::manage(dynamic_cast<Gtk::CheckButton *>(widg));
+ widg = dynamic_cast<Gtk::Widget *>(widgRegistered);
+ }
+ Glib::ustring *tip = param->param_getTooltip();
+ if (widg) {
+ 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 LPEBSpline::toDefaultWeight(Gtk::Widget *widgWeight)
+{
+ weight.param_set_value(defaultStartPower);
+ changeWeight(defaultStartPower);
+ Gtk::HBox * scalarParameter = dynamic_cast<Gtk::HBox *>(widgWeight);
+ std::vector< Gtk::Widget* > childList = scalarParameter->get_children();
+ Gtk::Entry* entryWidg = dynamic_cast<Gtk::Entry *>(childList[1]);
+ entryWidg->set_text("defaultStartPower");
+}
+
+void LPEBSpline::toMakeCusp(Gtk::Widget *widgWeight)
+{
+ weight.param_set_value(noPower);
+ changeWeight(noPower);
+ Gtk::HBox * scalarParameter = dynamic_cast<Gtk::HBox *>(widgWeight);
+ std::vector< Gtk::Widget* > childList = scalarParameter->get_children();
+ Gtk::Entry* entryWidg = dynamic_cast<Gtk::Entry *>(childList[1]);
+ entryWidg->set_text("noPower");
+}
+
+void LPEBSpline::toWeight()
+{
+ changeWeight(weight);
+}
+
+void LPEBSpline::changeWeight(double weightValue)
+{
+ SPDesktop *desktop = inkscape_active_desktop();
+ Inkscape::Selection *selection = sp_desktop_selection(desktop);
+ GSList *items = (GSList *)selection->itemList();
+ SPItem *item = (SPItem *)g_slist_nth(items, 0)->data;
+ SPPath *path = SP_PATH(item);
+ SPCurve *curve = path->get_curve_for_edit();
+ LPEBSpline::doBSplineFromWidget(curve, weightValue);
+ gchar *str = sp_svg_write_path(curve->get_pathvector());
+ path->getRepr()->setAttribute("inkscape:original-d", str);
+ if (INK_IS_NODE_TOOL(desktop->event_context)) {
+ Inkscape::UI::Tools::NodeTool *nt = INK_NODE_TOOL(desktop->event_context);
+ nt->desktop->updateNow();
+ }
+ g_free(str);
+ curve->unref();
+ desktop->clearWaitingCursor();
+ DocumentUndo::done(sp_desktop_document(desktop), SP_VERB_CONTEXT_LPE,
+ _("Modified the weight of the BSpline"));
+}
+
+bool LPEBSpline::nodeIsSelected(Geom::Point nodePoint)
+{
+ using Geom::X;
+ using Geom::Y;
+
+ if (points.size() > 0) {
+ for (std::vector<Geom::Point>::iterator i = points.begin();
+ i != points.end(); ++i) {
+ Geom::Point p = *i;
+ if (Geom::are_near(p, nodePoint, handleCubicGap)) {
+ return true;
+ } else {
+ }
+ }
+ }
+ return false;
+}
+
+void LPEBSpline::doBSplineFromWidget(SPCurve *curve, double weightValue)
+{
+ using Geom::X;
+ using Geom::Y;
+ SPDesktop *desktop = inkscape_active_desktop();
+ if (INK_IS_NODE_TOOL(desktop->event_context)) {
+ Inkscape::UI::Tools::NodeTool *nt = INK_NODE_TOOL(desktop->event_context);
+ Inkscape::UI::ControlPointSelection::Set &selection =
+ nt->_selected_nodes->allPoints();
+ points.clear();
+ std::vector<Geom::Point>::iterator pbegin;
+ for (Inkscape::UI::ControlPointSelection::Set::iterator i =
+ selection.begin();
+ i != selection.end(); ++i) {
+ if ((*i)->selected()) {
+ Inkscape::UI::Node *n = dynamic_cast<Inkscape::UI::Node *>(*i);
+ pbegin = points.begin();
+ points.insert(pbegin, desktop->doc2dt(n->position()));
+ }
+ }
+ }
+ //bool hasNodesSelected = LPEBspline::hasNodesSelected();
+ if (curve->get_segment_count() < 1)
+ return;
+ // Make copy of old path as it is changed during processing
+ Geom::PathVector const original_pathv = curve->get_pathvector();
+ curve->reset();
+
+ //Recorremos todos los paths a los que queremos aplicar el efecto, hasta el
+ //penúltimo
+ for (Geom::PathVector::const_iterator path_it = original_pathv.begin();
+ path_it != original_pathv.end(); ++path_it) {
+ //Si está vacío...
+ if (path_it->empty())
+ continue;
+ //Itreadores
+
+ Geom::Path::const_iterator curve_it1 = path_it->begin(); // incoming curve
+ Geom::Path::const_iterator curve_it2 =
+ ++(path_it->begin()); // outgoing curve
+ Geom::Path::const_iterator curve_endit =
+ path_it->end_default(); // this determines when the loop has to stop
+ //Creamos las lineas rectas que unen todos los puntos del trazado y donde se
+ //calcularán
+ //los puntos clave para los manejadores.
+ //Esto hace que la curva BSpline no pierda su condición aunque se trasladen
+ //dichos manejadores
+ SPCurve *nCurve = new SPCurve();
+ Geom::Point pointAt0(0, 0);
+ Geom::Point pointAt1(0, 0);
+ Geom::Point pointAt2(0, 0);
+ Geom::Point pointAt3(0, 0);
+ Geom::D2<Geom::SBasis> SBasisIn;
+ Geom::D2<Geom::SBasis> SBasisOut;
+ Geom::CubicBezier const *cubic = NULL;
+ if (path_it->closed()) {
+ // if the path is closed, maybe we have to stop a bit earlier because the
+ // closing line segment has zerolength.
+ const Geom::Curve &closingline =
+ path_it->back_closed(); // the closing line segment is always of type
+ // Geom::LineSegment.
+ if (are_near(closingline.initialPoint(), closingline.finalPoint())) {
+ // closingline.isDegenerate() did not work, because it only checks for
+ // *exact* zero length, which goes wrong for relative coordinates and
+ // rounding errors...
+ // the closing line segment has zero-length. So stop before that one!
+ curve_endit = path_it->end_open();
+ }
+ }
+ //Si la curva está cerrada calculamos el punto donde
+ //deveria estar el nodo BSpline de cierre/inicio de la curva
+ //en posible caso de que se cierre con una linea recta creando un nodo
+ //BSPline
+ nCurve->moveto(curve_it1->initialPoint());
+ //Recorremos todos los segmentos menos el último
+ while (curve_it1 != curve_endit) {
+ //previousPointAt3 = pointAt3;
+ //Calculamos los puntos que dividirían en tres segmentos iguales el path
+ //recto de entrada y de salida
+ SPCurve *in = new SPCurve();
+ in->moveto(curve_it1->initialPoint());
+ in->lineto(curve_it1->finalPoint());
+ cubic = dynamic_cast<Geom::CubicBezier const *>(&*curve_it1);
+ pointAt0 = in->first_segment()->initialPoint();
+ pointAt3 = in->first_segment()->finalPoint();
+ SBasisIn = in->first_segment()->toSBasis();
+ if (!onlySelected) {
+ if (cubic) {
+ if (!ignoreCusp || !Geom::are_near((*cubic)[1], pointAt0)) {
+ pointAt1 = SBasisIn.valueAt(weightValue);
+ if (weightValue != noPower) {
+ pointAt1 =
+ Geom::Point(pointAt1[X] + handleCubicGap, pointAt1[Y] + handleCubicGap);
+ }
+ } else {
+ pointAt1 = in->first_segment()->initialPoint();
+ }
+ if (!ignoreCusp || !Geom::are_near((*cubic)[2], pointAt3)) {
+ pointAt2 = SBasisIn.valueAt(1 - weightValue);
+ if (weightValue != noPower) {
+ pointAt2 =
+ Geom::Point(pointAt2[X] + handleCubicGap, pointAt2[Y] + handleCubicGap);
+ }
+ } else {
+ pointAt2 = in->first_segment()->finalPoint();
+ }
+ } else {
+ if (!ignoreCusp && weightValue != noPower) {
+ pointAt1 = SBasisIn.valueAt(weightValue);
+ if (weightValue != noPower) {
+ pointAt1 =
+ Geom::Point(pointAt1[X] + handleCubicGap, pointAt1[Y] + handleCubicGap);
+ }
+ pointAt2 = SBasisIn.valueAt(1 - weightValue);
+ if (weightValue != noPower) {
+ pointAt2 =
+ Geom::Point(pointAt2[X] + handleCubicGap, pointAt2[Y] + handleCubicGap);
+ }
+ } else {
+ pointAt1 = in->first_segment()->initialPoint();
+ pointAt2 = in->first_segment()->finalPoint();
+ }
+ }
+ } else {
+ if (cubic) {
+ if (!ignoreCusp || !Geom::are_near((*cubic)[1], pointAt0)) {
+ if (nodeIsSelected(pointAt0)) {
+ pointAt1 = SBasisIn.valueAt(weightValue);
+ if (weightValue != noPower) {
+ pointAt1 =
+ Geom::Point(pointAt1[X] + handleCubicGap, pointAt1[Y] + handleCubicGap);
+ }
+ } else {
+ pointAt1 = (*cubic)[1];
+ }
+ } else {
+ pointAt1 = in->first_segment()->initialPoint();
+ }
+ if (!ignoreCusp || !Geom::are_near((*cubic)[2], pointAt3)) {
+ if (nodeIsSelected(pointAt3)) {
+ pointAt2 = SBasisIn.valueAt(1 - weightValue);
+ if (weightValue != noPower) {
+ pointAt2 =
+ Geom::Point(pointAt2[X] + handleCubicGap, pointAt2[Y] + handleCubicGap);
+ }
+ } else {
+ pointAt2 = (*cubic)[2];
+ }
+ } else {
+ pointAt2 = in->first_segment()->finalPoint();
+ }
+ } else {
+ if (!ignoreCusp && weightValue != noPower) {
+ if (nodeIsSelected(pointAt0)) {
+ pointAt1 = SBasisIn.valueAt(weightValue);
+ pointAt1 =
+ Geom::Point(pointAt1[X] + handleCubicGap, pointAt1[Y] + handleCubicGap);
+ } else {
+ pointAt1 = in->first_segment()->initialPoint();
+ }
+ if (nodeIsSelected(pointAt3)) {
+ pointAt2 = SBasisIn.valueAt(weightValue);
+ pointAt2 =
+ Geom::Point(pointAt2[X] + handleCubicGap, pointAt2[Y] + handleCubicGap);
+ } else {
+ pointAt2 = in->first_segment()->finalPoint();
+ }
+ } else {
+ pointAt1 = in->first_segment()->initialPoint();
+ pointAt2 = in->first_segment()->finalPoint();
+ }
+ }
+ }
+ in->reset();
+ delete in;
+ //La curva BSpline se forma calculando el centro del segmanto de unión
+ //de el punto situado en las 2/3 partes de el segmento de entrada
+ //con el punto situado en la posición 1/3 del segmento de salida
+ //Estos dos puntos ademas estan posicionados en el lugas correspondiente
+ //de
+ //los manejadores de la curva
+ nCurve->curveto(pointAt1, pointAt2, pointAt3);
+ //aumentamos los valores para el siguiente paso en el bucle
+ ++curve_it1;
+ ++curve_it2;
+ }
+ if (path_it->closed()) {
+ nCurve->move_endpoints(path_it->begin()->initialPoint(),
+ path_it->begin()->initialPoint());
+ } else {
+ nCurve->move_endpoints(path_it->begin()->initialPoint(), pointAt3);
+ }
+ //y cerramos la curva
+ if (path_it->closed()) {
+ nCurve->closepath_current();
+ }
+ curve->append(nCurve, false);
+ nCurve->reset();
+ delete nCurve;
+ }
+}
+
+}; //namespace LivePathEffect
+}; /* namespace Inkscape */
+
+/*
+ Local Variables:
+ mode:c++
+ c-file-style:"stroustrup"
+ c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
+ indent-tabs-mode:nil
+ fill-column:99
+ End:
+*/
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4 :
diff --git a/src/live_effects/lpe-bspline.h b/src/live_effects/lpe-bspline.h
new file mode 100644
index 000000000..169658b94
--- /dev/null
+++ b/src/live_effects/lpe-bspline.h
@@ -0,0 +1,56 @@
+#ifndef INKSCAPE_LPE_BSPLINE_H
+#define INKSCAPE_LPE_BSPLINE_H
+
+/*
+ * Inkscape::LPEBSpline
+ *
+ * Released under GNU GPL, read the file 'COPYING' for more information
+ */
+
+#include "live_effects/effect.h"
+#include "live_effects/parameter/bool.h"
+#include <vector>
+
+namespace Inkscape {
+namespace LivePathEffect {
+
+class LPEBSpline : public Effect {
+public:
+ LPEBSpline(LivePathEffectObject *lpeobject);
+ virtual ~LPEBSpline();
+
+ virtual void createAndApply(const char *name, SPDocument *doc, SPItem *item);
+ virtual LPEPathFlashType pathFlashType() const {
+ return SUPPRESS_FLASH;
+ }
+ virtual void doEffect(SPCurve *curve);
+ virtual void doBeforeEffect (SPLPEItem const* lpeitem);
+ void drawHandle(Geom::Point p, double radiusHelperNodes);
+ void addCanvasIndicators(SPLPEItem const */*lpeitem*/, std::vector<Geom::PathVector> &hp_vec);
+ virtual void doBSplineFromWidget(SPCurve *curve, double value);
+ virtual bool nodeIsSelected(Geom::Point nodePoint);
+ virtual Gtk::Widget *newWidget();
+ virtual void changeWeight(double weightValue);
+ virtual void toDefaultWeight(Gtk::Widget *widgWeight);
+ virtual void toMakeCusp(Gtk::Widget *widgWeight);
+ virtual void toWeight();
+
+ // TODO make this private
+ ScalarParam steps;
+
+private:
+ std::vector<Geom::Point> points;
+ BoolParam ignoreCusp;
+ BoolParam onlySelected;
+ BoolParam showHelper;
+ ScalarParam weight;
+ Geom::PathVector hp;
+
+ LPEBSpline(const LPEBSpline &);
+ LPEBSpline &operator=(const LPEBSpline &);
+
+};
+
+} //namespace LivePathEffect
+} //namespace Inkscape
+#endif
diff --git a/src/live_effects/lpe-copy_rotate.cpp b/src/live_effects/lpe-copy_rotate.cpp
index 65bbcdad1..e466093d3 100644
--- a/src/live_effects/lpe-copy_rotate.cpp
+++ b/src/live_effects/lpe-copy_rotate.cpp
@@ -12,6 +12,7 @@
*/
#include <glibmm/i18n.h>
+#include <gdk/gdk.h>
#include "live_effects/lpe-copy_rotate.h"
#include "sp-shape.h"
diff --git a/src/live_effects/lpe-ellipse_5pts.cpp b/src/live_effects/lpe-ellipse_5pts.cpp
new file mode 100644
index 000000000..b0a5919fe
--- /dev/null
+++ b/src/live_effects/lpe-ellipse_5pts.cpp
@@ -0,0 +1,214 @@
+/** \file
+ * LPE "Ellipse through 5 points" implementation
+ */
+
+/*
+ * Authors:
+ * Theodore Janeczko
+ *
+ * Copyright (C) Theodore Janeczko 2012 <flutterguy317@gmail.com>
+ *
+ * Released under GNU GPL, read the file 'COPYING' for more information
+ */
+
+#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/path.h>
+#include <2geom/circle.h>
+#include <2geom/ellipse.h>
+#include <2geom/path-sink.h>
+#include "inkscape.h"
+#include "desktop.h"
+#include "message-stack.h"
+
+namespace Inkscape {
+namespace LivePathEffect {
+
+LPEEllipse5Pts::LPEEllipse5Pts(LivePathEffectObject *lpeobject) :
+ Effect(lpeobject)
+{
+ //perceived_path = true;
+}
+
+LPEEllipse5Pts::~LPEEllipse5Pts()
+{
+}
+
+static double _det3(double (*mat)[3])
+{
+ for (int i = 0; i < 2; i++)
+ {
+ for (int j = i + 1; j < 3; j++)
+ {
+ for (int k = i + 1; k < 3; k++)
+ {
+ mat[j][k] = (mat[j][k] * mat[i][i] - mat[j][i] * mat[i][k]);
+ if (i) mat[j][k] /= mat[i-1][i-1];
+ }
+ }
+ }
+ return mat[2][2];
+}
+static double _det5(double (*mat)[5])
+{
+ for (int i = 0; i < 4; i++)
+ {
+ for (int j = i + 1; j < 5; j++)
+ {
+ for (int k = i + 1; k < 5; k++)
+ {
+ mat[j][k] = (mat[j][k] * mat[i][i] - mat[j][i] * mat[i][k]);
+ if (i) mat[j][k] /= mat[i-1][i-1];
+ }
+ }
+ }
+ return mat[4][4];
+}
+
+std::vector<Geom::Path>
+LPEEllipse5Pts::doEffect_path (std::vector<Geom::Path> const & path_in)
+{
+ std::vector<Geom::Path> path_out = std::vector<Geom::Path>();
+
+ if (path_in[0].size() < 4) {
+
+ SP_ACTIVE_DESKTOP->messageStack()->flash(Inkscape::WARNING_MESSAGE, _("Five points required for constructing an ellipse"));
+ return path_in;
+ }
+ // we assume that the path has >= 3 nodes
+ Geom::Point A = path_in[0].initialPoint();
+ Geom::Point B = path_in[0].pointAt(1);
+ Geom::Point C = path_in[0].pointAt(2);
+ Geom::Point D = path_in[0].pointAt(3);
+ Geom::Point E = path_in[0].pointAt(4);
+
+ using namespace Geom;
+
+ double rowmajor_matrix[5][6] =
+ {
+ {A.x()*A.x(), A.x()*A.y(), A.y()*A.y(), A.x(), A.y(), 1},
+ {B.x()*B.x(), B.x()*B.y(), B.y()*B.y(), B.x(), B.y(), 1},
+ {C.x()*C.x(), C.x()*C.y(), C.y()*C.y(), C.x(), C.y(), 1},
+ {D.x()*D.x(), D.x()*D.y(), D.y()*D.y(), D.x(), D.y(), 1},
+ {E.x()*E.x(), E.x()*E.y(), E.y()*E.y(), E.x(), E.y(), 1}
+ };
+
+ double mat_a[5][5] =
+ {
+ {rowmajor_matrix[0][1], rowmajor_matrix[1][1], rowmajor_matrix[2][1], rowmajor_matrix[3][1], rowmajor_matrix[4][1]},
+ {rowmajor_matrix[0][2], rowmajor_matrix[1][2], rowmajor_matrix[2][2], rowmajor_matrix[3][2], rowmajor_matrix[4][2]},
+ {rowmajor_matrix[0][3], rowmajor_matrix[1][3], rowmajor_matrix[2][3], rowmajor_matrix[3][3], rowmajor_matrix[4][3]},
+ {rowmajor_matrix[0][4], rowmajor_matrix[1][4], rowmajor_matrix[2][4], rowmajor_matrix[3][4], rowmajor_matrix[4][4]},
+ {rowmajor_matrix[0][5], rowmajor_matrix[1][5], rowmajor_matrix[2][5], rowmajor_matrix[3][5], rowmajor_matrix[4][5]}
+ };
+ double mat_b[5][5] =
+ {
+ {rowmajor_matrix[0][0], rowmajor_matrix[1][0], rowmajor_matrix[2][0], rowmajor_matrix[3][0], rowmajor_matrix[4][0]},
+ {rowmajor_matrix[0][2], rowmajor_matrix[1][2], rowmajor_matrix[2][2], rowmajor_matrix[3][2], rowmajor_matrix[4][2]},
+ {rowmajor_matrix[0][3], rowmajor_matrix[1][3], rowmajor_matrix[2][3], rowmajor_matrix[3][3], rowmajor_matrix[4][3]},
+ {rowmajor_matrix[0][4], rowmajor_matrix[1][4], rowmajor_matrix[2][4], rowmajor_matrix[3][4], rowmajor_matrix[4][4]},
+ {rowmajor_matrix[0][5], rowmajor_matrix[1][5], rowmajor_matrix[2][5], rowmajor_matrix[3][5], rowmajor_matrix[4][5]}
+ };
+ double mat_c[5][5] =
+ {
+ {rowmajor_matrix[0][0], rowmajor_matrix[1][0], rowmajor_matrix[2][0], rowmajor_matrix[3][0], rowmajor_matrix[4][0]},
+ {rowmajor_matrix[0][1], rowmajor_matrix[1][1], rowmajor_matrix[2][1], rowmajor_matrix[3][1], rowmajor_matrix[4][1]},
+ {rowmajor_matrix[0][3], rowmajor_matrix[1][3], rowmajor_matrix[2][3], rowmajor_matrix[3][3], rowmajor_matrix[4][3]},
+ {rowmajor_matrix[0][4], rowmajor_matrix[1][4], rowmajor_matrix[2][4], rowmajor_matrix[3][4], rowmajor_matrix[4][4]},
+ {rowmajor_matrix[0][5], rowmajor_matrix[1][5], rowmajor_matrix[2][5], rowmajor_matrix[3][5], rowmajor_matrix[4][5]}
+ };
+ double mat_d[5][5] =
+ {
+ {rowmajor_matrix[0][0], rowmajor_matrix[1][0], rowmajor_matrix[2][0], rowmajor_matrix[3][0], rowmajor_matrix[4][0]},
+ {rowmajor_matrix[0][1], rowmajor_matrix[1][1], rowmajor_matrix[2][1], rowmajor_matrix[3][1], rowmajor_matrix[4][1]},
+ {rowmajor_matrix[0][2], rowmajor_matrix[1][2], rowmajor_matrix[2][2], rowmajor_matrix[3][2], rowmajor_matrix[4][2]},
+ {rowmajor_matrix[0][4], rowmajor_matrix[1][4], rowmajor_matrix[2][4], rowmajor_matrix[3][4], rowmajor_matrix[4][4]},
+ {rowmajor_matrix[0][5], rowmajor_matrix[1][5], rowmajor_matrix[2][5], rowmajor_matrix[3][5], rowmajor_matrix[4][5]}
+ };
+ double mat_e[5][5] =
+ {
+ {rowmajor_matrix[0][0], rowmajor_matrix[1][0], rowmajor_matrix[2][0], rowmajor_matrix[3][0], rowmajor_matrix[4][0]},
+ {rowmajor_matrix[0][1], rowmajor_matrix[1][1], rowmajor_matrix[2][1], rowmajor_matrix[3][1], rowmajor_matrix[4][1]},
+ {rowmajor_matrix[0][2], rowmajor_matrix[1][2], rowmajor_matrix[2][2], rowmajor_matrix[3][2], rowmajor_matrix[4][2]},
+ {rowmajor_matrix[0][3], rowmajor_matrix[1][3], rowmajor_matrix[2][3], rowmajor_matrix[3][3], rowmajor_matrix[4][3]},
+ {rowmajor_matrix[0][5], rowmajor_matrix[1][5], rowmajor_matrix[2][5], rowmajor_matrix[3][5], rowmajor_matrix[4][5]}
+ };
+ double mat_f[5][5] =
+ {
+ {rowmajor_matrix[0][0], rowmajor_matrix[1][0], rowmajor_matrix[2][0], rowmajor_matrix[3][0], rowmajor_matrix[4][0]},
+ {rowmajor_matrix[0][1], rowmajor_matrix[1][1], rowmajor_matrix[2][1], rowmajor_matrix[3][1], rowmajor_matrix[4][1]},
+ {rowmajor_matrix[0][2], rowmajor_matrix[1][2], rowmajor_matrix[2][2], rowmajor_matrix[3][2], rowmajor_matrix[4][2]},
+ {rowmajor_matrix[0][3], rowmajor_matrix[1][3], rowmajor_matrix[2][3], rowmajor_matrix[3][3], rowmajor_matrix[4][3]},
+ {rowmajor_matrix[0][4], rowmajor_matrix[1][4], rowmajor_matrix[2][4], rowmajor_matrix[3][4], rowmajor_matrix[4][4]}
+ };
+
+ double a1 = _det5(mat_a);
+ double b1 = -_det5(mat_b);
+ double c1 = _det5(mat_c);
+ double d1 = -_det5(mat_d);
+ double e1 = _det5(mat_e);
+ double f1 = -_det5(mat_f);
+
+ double mat_check[][3] =
+ {
+ {a1, b1/2, d1/2},
+ {b1/2, c1, e1/2},
+ {d1/2, e1/2, f1}
+ };
+
+ if (_det3(mat_check) == 0 || a1*c1 - b1*b1/4 <= 0) {
+ SP_ACTIVE_DESKTOP->messageStack()->flash(Inkscape::WARNING_MESSAGE, _("No ellipse found for specified points"));
+ return path_in;
+ }
+
+ Geom::Ellipse el(a1, b1, c1, d1, e1, f1);
+
+ double s, e;
+ double x0, y0, x1, y1, x2, y2, x3, y3;
+ double len;
+
+ // figure out if we have a slice, guarding against rounding errors
+
+ Path p(Geom::Point(cos(0), sin(0)));
+
+ double end = 2 * M_PI;
+ for (s = 0; s < end; s += M_PI_2) {
+ e = s + M_PI_2;
+ if (e > end)
+ e = end;
+ len = 4*tan((e - s)/4)/3;
+ x0 = cos(s);
+ y0 = sin(s);
+ x1 = x0 + len * cos(s + M_PI_2);
+ y1 = y0 + len * sin(s + M_PI_2);
+ x3 = cos(e);
+ y3 = sin(e);
+ x2 = x3 + len * cos(e - M_PI_2);
+ y2 = y3 + len * sin(e - M_PI_2);
+ p.appendNew<Geom::CubicBezier>(Geom::Point(x1,y1), Geom::Point(x2,y2), Geom::Point(x3,y3));
+ }
+
+ Geom::Affine aff = Geom::Scale(el.ray(Geom::X), el.ray(Geom::Y)) * Geom::Rotate(el.rot_angle()) * Geom::Translate(el.center());
+
+ path_out.push_back(p * aff);
+
+ return path_out;
+}
+
+/* ######################## */
+
+} //namespace LivePathEffect
+} /* namespace Inkscape */
+
+/*
+ Local Variables:
+ mode:c++
+ c-file-style:"stroustrup"
+ c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
+ indent-tabs-mode:nil
+ fill-column:99
+ End:
+*/
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4 :
diff --git a/src/live_effects/lpe-ellipse_5pts.h b/src/live_effects/lpe-ellipse_5pts.h
new file mode 100644
index 000000000..d3b1fccfa
--- /dev/null
+++ b/src/live_effects/lpe-ellipse_5pts.h
@@ -0,0 +1,50 @@
+#ifndef INKSCAPE_LPE_ELLIPSE_5PTS_H
+#define INKSCAPE_LPE_ELLIPSE_5PTS_H
+
+/** \file
+ * LPE "Ellipse through 5 points" implementation
+ */
+
+/*
+ * Authors:
+ * Theodore Janeczko
+ *
+ * Copyright (C) Theodore Janeczko 2012 <flutterguy317@gmail.com>
+ *
+ * Released under GNU GPL, read the file 'COPYING' for more information
+ */
+
+#include "live_effects/effect.h"
+#include "live_effects/parameter/parameter.h"
+#include "live_effects/parameter/point.h"
+
+namespace Inkscape {
+namespace LivePathEffect {
+
+class LPEEllipse5Pts : public Effect {
+public:
+ LPEEllipse5Pts(LivePathEffectObject *lpeobject);
+ virtual ~LPEEllipse5Pts();
+
+ virtual std::vector<Geom::Path> doEffect_path (std::vector<Geom::Path> const & path_in);
+
+private:
+ LPEEllipse5Pts(const LPEEllipse5Pts&);
+ LPEEllipse5Pts& operator=(const LPEEllipse5Pts&);
+};
+
+} //namespace LivePathEffect
+} //namespace Inkscape
+
+#endif
+
+/*
+ Local Variables:
+ mode:c++
+ c-file-style:"stroustrup"
+ c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
+ indent-tabs-mode:nil
+ fill-column:99
+ End:
+*/
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4 :
diff --git a/src/live_effects/lpe-envelope.cpp b/src/live_effects/lpe-envelope.cpp
index 4f5623fba..05a672ae8 100644
--- a/src/live_effects/lpe-envelope.cpp
+++ b/src/live_effects/lpe-envelope.cpp
@@ -32,7 +32,7 @@ LPEEnvelope::LPEEnvelope(LivePathEffectObject *lpeobject) :
bend_path2(_("Right bend path:"), _("Right path along which to bend the original path"), "bendpath2", &wr, this, "M0,0 L1,0"),
bend_path3(_("Bottom bend path:"), _("Bottom path along which to bend the original path"), "bendpath3", &wr, this, "M0,0 L1,0"),
bend_path4(_("Left bend path:"), _("Left path along which to bend the original path"), "bendpath4", &wr, this, "M0,0 L1,0"),
- xx(_("E_nable left & right paths"), _("Enable the left and right deformation paths"), "xx", &wr, this, true),
+ xx(_("_Enable left & right paths"), _("Enable the left and right deformation paths"), "xx", &wr, this, true),
yy(_("_Enable top & bottom paths"), _("Enable the top and bottom deformation paths"), "yy", &wr, this, true)
{
registerParameter( dynamic_cast<Parameter *>(&yy) );
@@ -54,6 +54,9 @@ LPEEnvelope::doBeforeEffect (SPLPEItem const* lpeitem)
{
// get the item bounding box
original_bbox(lpeitem);
+ SPLPEItem * item = const_cast<SPLPEItem*>(lpeitem);
+ item->apply_to_clippath(item);
+ item->apply_to_mask(item);
}
Geom::Piecewise<Geom::D2<Geom::SBasis> >
diff --git a/src/live_effects/lpe-fill-between-many.cpp b/src/live_effects/lpe-fill-between-many.cpp
new file mode 100644
index 000000000..7cf354044
--- /dev/null
+++ b/src/live_effects/lpe-fill-between-many.cpp
@@ -0,0 +1,78 @@
+/*
+ * Copyright (C) Theodore Janeczko 2012 <flutterguy317@gmail.com>
+ *
+ * Released under GNU GPL, read the file 'COPYING' for more information
+ */
+
+#include <gtkmm/box.h>
+
+#include "live_effects/lpe-fill-between-many.h"
+
+#include "display/curve.h"
+#include "sp-item.h"
+#include "2geom/path.h"
+#include "sp-shape.h"
+#include "sp-text.h"
+#include "2geom/bezier-curve.h"
+
+#include <glibmm/i18n.h>
+
+namespace Inkscape {
+namespace LivePathEffect {
+
+LPEFillBetweenMany::LPEFillBetweenMany(LivePathEffectObject *lpeobject) :
+ Effect(lpeobject),
+ linked_paths(_("Linked path:"), _("Paths from which to take the original path data"), "linkedpaths", &wr, this)
+{
+ registerParameter( dynamic_cast<Parameter *>(&linked_paths) );
+ //perceived_path = true;
+}
+
+LPEFillBetweenMany::~LPEFillBetweenMany()
+{
+
+}
+
+void LPEFillBetweenMany::doEffect (SPCurve * curve)
+{
+ std::vector<Geom::Path> res_pathv;
+ SPItem * firstObj = NULL;
+ for (std::vector<PathAndDirection*>::iterator iter = linked_paths._vector.begin(); iter != linked_paths._vector.end(); iter++) {
+ SPObject *obj;
+ if ((*iter)->ref.isAttached() && (obj = (*iter)->ref.getObject()) && SP_IS_ITEM(obj) && !(*iter)->_pathvector.empty()) {
+ Geom::Path linked_path;
+ if ((*iter)->reversed) {
+ linked_path = (*iter)->_pathvector.front().reverse();
+ } else {
+ linked_path = (*iter)->_pathvector.front();
+ }
+
+ if (!res_pathv.empty()) {
+ linked_path = linked_path * SP_ITEM(obj)->getRelativeTransform(firstObj);
+ res_pathv.front().appendNew<Geom::LineSegment>(linked_path.initialPoint());
+ res_pathv.front().append(linked_path);
+ } else {
+ firstObj = SP_ITEM(obj);
+ res_pathv.push_back(linked_path);
+ }
+ }
+ }
+ if (!res_pathv.empty()) {
+ res_pathv.front().close();
+ }
+ curve->set_pathvector(res_pathv);
+}
+
+} // namespace LivePathEffect
+} /* namespace Inkscape */
+
+/*
+ Local Variables:
+ mode:c++
+ c-file-style:"stroustrup"
+ c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
+ indent-tabs-mode:nil
+ fill-column:99
+ End:
+*/
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4 :
diff --git a/src/live_effects/lpe-fill-between-many.h b/src/live_effects/lpe-fill-between-many.h
new file mode 100644
index 000000000..99ee8b15f
--- /dev/null
+++ b/src/live_effects/lpe-fill-between-many.h
@@ -0,0 +1,36 @@
+#ifndef INKSCAPE_LPE_FILL_BETWEEN_MANY_H
+#define INKSCAPE_LPE_FILL_BETWEEN_MANY_H
+
+/*
+ * Inkscape::LPEFillBetweenStrokes
+ *
+ * Copyright (C) Theodore Janeczko 2012 <flutterguy317@gmail.com>
+ *
+ * Released under GNU GPL, read the file 'COPYING' for more information
+ */
+
+#include "live_effects/effect.h"
+#include "live_effects/parameter/originalpatharray.h"
+
+namespace Inkscape {
+namespace LivePathEffect {
+
+class LPEFillBetweenMany : public Effect {
+public:
+ LPEFillBetweenMany(LivePathEffectObject *lpeobject);
+ virtual ~LPEFillBetweenMany();
+
+ virtual void doEffect (SPCurve * curve);
+
+private:
+ OriginalPathArrayParam linked_paths;
+
+private:
+ LPEFillBetweenMany(const LPEFillBetweenMany&);
+ LPEFillBetweenMany& operator=(const LPEFillBetweenMany&);
+};
+
+}; //namespace LivePathEffect
+}; //namespace Inkscape
+
+#endif
diff --git a/src/live_effects/lpe-fill-between-strokes.cpp b/src/live_effects/lpe-fill-between-strokes.cpp
new file mode 100644
index 000000000..e72979ed0
--- /dev/null
+++ b/src/live_effects/lpe-fill-between-strokes.cpp
@@ -0,0 +1,116 @@
+/*
+ * Copyright (C) Theodore Janeczko 2012 <flutterguy317@gmail.com>
+ *
+ * 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-item.h"
+#include "2geom/path.h"
+#include "sp-shape.h"
+#include "sp-text.h"
+#include "2geom/bezier-curve.h"
+
+namespace Inkscape {
+namespace LivePathEffect {
+
+LPEFillBetweenStrokes::LPEFillBetweenStrokes(LivePathEffectObject *lpeobject) :
+ Effect(lpeobject),
+ linked_path(_("Linked path:"), _("Path from which to take the original path data"), "linkedpath", &wr, this),
+ second_path(_("Second path:"), _("Second path from which to take the original path data"), "secondpath", &wr, this),
+ reverse_second(_("Reverse Second"), _("Reverses the second path order"), "reversesecond", &wr, this)
+{
+ registerParameter( dynamic_cast<Parameter *>(&linked_path) );
+ registerParameter( dynamic_cast<Parameter *>(&second_path) );
+ registerParameter( dynamic_cast<Parameter *>(&reverse_second) );
+ //perceived_path = true;
+}
+
+LPEFillBetweenStrokes::~LPEFillBetweenStrokes()
+{
+
+}
+
+void LPEFillBetweenStrokes::doEffect (SPCurve * curve)
+{
+ if (curve) {
+ if ( linked_path.linksToPath() && second_path.linksToPath() && linked_path.getObject() && second_path.getObject() ) {
+ std::vector<Geom::Path> linked_pathv = linked_path.get_pathvector();
+ std::vector<Geom::Path> second_pathv = second_path.get_pathvector();
+ std::vector<Geom::Path> result_linked_pathv;
+ std::vector<Geom::Path> result_second_pathv;
+ Geom::Affine second_transform = second_path.getObject()->getRelativeTransform(linked_path.getObject());
+
+ for (std::vector<Geom::Path>::iterator iter = linked_pathv.begin(); iter != linked_pathv.end(); ++iter)
+ {
+ result_linked_pathv.push_back((*iter));
+ }
+ for (std::vector<Geom::Path>::iterator iter = second_pathv.begin(); iter != second_pathv.end(); ++iter)
+ {
+ result_second_pathv.push_back((*iter) * second_transform);
+ }
+
+ if ( !result_linked_pathv.empty() && !result_second_pathv.empty() && !result_linked_pathv.front().closed() ) {
+ if (reverse_second.get_value())
+ {
+ result_linked_pathv.front().appendNew<Geom::LineSegment>(result_second_pathv.front().finalPoint());
+ result_linked_pathv.front().append(result_second_pathv.front().reverse());
+ }
+ else
+ {
+ result_linked_pathv.front().appendNew<Geom::LineSegment>(result_second_pathv.front().initialPoint());
+ result_linked_pathv.front().append(result_second_pathv.front());
+ }
+ curve->set_pathvector(result_linked_pathv);
+ }
+ else if ( !result_linked_pathv.empty() ) {
+ curve->set_pathvector(result_linked_pathv);
+ }
+ else if ( !result_second_pathv.empty() ) {
+ curve->set_pathvector(result_second_pathv);
+ }
+ }
+ else if ( linked_path.linksToPath() && linked_path.getObject() ) {
+ std::vector<Geom::Path> linked_pathv = linked_path.get_pathvector();
+ std::vector<Geom::Path> result_pathv;
+
+ for (std::vector<Geom::Path>::iterator iter = linked_pathv.begin(); iter != linked_pathv.end(); ++iter)
+ {
+ result_pathv.push_back((*iter));
+ }
+ if ( !result_pathv.empty() ) {
+ curve->set_pathvector(result_pathv);
+ }
+ }
+ else if ( second_path.linksToPath() && second_path.getObject() ) {
+ std::vector<Geom::Path> second_pathv = second_path.get_pathvector();
+ std::vector<Geom::Path> result_pathv;
+
+ for (std::vector<Geom::Path>::iterator iter = second_pathv.begin(); iter != second_pathv.end(); ++iter)
+ {
+ result_pathv.push_back((*iter));
+ }
+ if ( !result_pathv.empty() ) {
+ curve->set_pathvector(result_pathv);
+ }
+ }
+ }
+}
+
+} // namespace LivePathEffect
+} /* namespace Inkscape */
+
+/*
+ Local Variables:
+ mode:c++
+ c-file-style:"stroustrup"
+ c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
+ indent-tabs-mode:nil
+ fill-column:99
+ End:
+*/
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4 :
diff --git a/src/live_effects/lpe-fill-between-strokes.h b/src/live_effects/lpe-fill-between-strokes.h
new file mode 100644
index 000000000..ec57b1852
--- /dev/null
+++ b/src/live_effects/lpe-fill-between-strokes.h
@@ -0,0 +1,38 @@
+#ifndef INKSCAPE_LPE_FILL_BETWEEN_STROKES_H
+#define INKSCAPE_LPE_FILL_BETWEEN_STROKES_H
+
+/*
+ * Inkscape::LPEFillBetweenStrokes
+ *
+ * Copyright (C) Theodore Janeczko 2012 <flutterguy317@gmail.com>
+ *
+ * Released under GNU GPL, read the file 'COPYING' for more information
+ */
+
+#include "live_effects/effect.h"
+#include "live_effects/parameter/originalpath.h"
+
+namespace Inkscape {
+namespace LivePathEffect {
+
+class LPEFillBetweenStrokes : public Effect {
+public:
+ LPEFillBetweenStrokes(LivePathEffectObject *lpeobject);
+ virtual ~LPEFillBetweenStrokes();
+
+ virtual void doEffect (SPCurve * curve);
+
+private:
+ OriginalPathParam linked_path;
+ OriginalPathParam second_path;
+ BoolParam reverse_second;
+
+private:
+ LPEFillBetweenStrokes(const LPEFillBetweenStrokes&);
+ LPEFillBetweenStrokes& operator=(const LPEFillBetweenStrokes&);
+};
+
+}; //namespace LivePathEffect
+}; //namespace Inkscape
+
+#endif
diff --git a/src/live_effects/lpe-fillet-chamfer.cpp b/src/live_effects/lpe-fillet-chamfer.cpp
new file mode 100644
index 000000000..f15bf9215
--- /dev/null
+++ b/src/live_effects/lpe-fillet-chamfer.cpp
@@ -0,0 +1,649 @@
+/*
+ * Author(s):
+ * Jabiertxo Arraiza Cenoz <jabier.arraiza@marker.es>
+ *
+ * Copyright (C) 2014 Author(s)
+ *
+ * Special thanks to Johan Engelen for the base of the effect -powerstroke-
+ * Also to ScislaC for point me to the idea
+ * Also su_v for his construvtive feedback and time
+ * Also to Mc- (IRC nick) for his important contribution to find real time
+ * values based on
+ * and finaly to Liam P. White for his big help on coding, that save me a lot of hours
+ *
+ * Released under GNU GPL, read the file 'COPYING' for more information
+ */
+#include "live_effects/lpe-fillet-chamfer.h"
+
+#include <2geom/sbasis-to-bezier.h>
+#include <2geom/svg-elliptical-arc.h>
+#include <2geom/line.h>
+
+#include "desktop.h"
+#include "display/curve.h"
+#include "helper/geom-nodetype.h"
+#include "helper/geom-curves.h"
+#include "helper/geom.h"
+
+#include "live_effects/parameter/filletchamferpointarray.h"
+
+// for programmatically updating knots
+#include "selection.h"
+#include "ui/tools-switch.h"
+#include "ui/tool/control-point-selection.h"
+#include "ui/tool/selectable-control-point.h"
+#include "ui/tool/node.h"
+#include "ui/tools/node-tool.h"
+
+// TODO due to internal breakage in glibmm headers, this must be last:
+#include <glibmm/i18n.h>
+
+using namespace Geom;
+namespace Inkscape {
+namespace LivePathEffect {
+
+static const Util::EnumData<FilletMethod> FilletMethodData[FM_END] = {
+ { FM_AUTO, N_("Auto"), "auto" },
+ { FM_ARC, N_("Force arc"), "arc" },
+ { FM_BEZIER, N_("Force bezier"), "bezier" }
+};
+static const Util::EnumDataConverter<FilletMethod>
+FMConverter(FilletMethodData, FM_END);
+
+const double tolerance = 0.001;
+const double gapHelper = 0.00001;
+
+LPEFilletChamfer::LPEFilletChamfer(LivePathEffectObject *lpeobject) :
+ Effect(lpeobject),
+ fillet_chamfer_values(_("Fillet point"), _("Fillet point"), "fillet_chamfer_values", &wr, this),
+ hide_knots(_("Hide knots"), _("Hide knots"), "hide_knots", &wr, this, false),
+ ignore_radius_0(_("Ignore 0 radius knots"), _("Ignore 0 radius knots"), "ignore_radius_0", &wr, this, false),
+ only_selected(_("Change only selected nodes"), _("Change only selected nodes"), "only_selected", &wr, this, false),
+ flexible(_("Flexible radius size (%)"), _("Flexible radius size (%)"), "flexible", &wr, this, false),
+ use_knot_distance(_("Use knots distance instead radius"), _("Use knots distance instead radius"), "use_knot_distance", &wr, this, false),
+ unit(_("Unit"), _("Unit"), "unit", &wr, this),
+ method(_("Method"), _("Fillets methods"), "method", FMConverter, &wr, this, FM_AUTO),
+ radius(_("Radius (unit or %)"), _("Radius, in unit or %"), "radius", &wr, this, 0.),
+ helper_size(_("Helper size with direction"), _("Helper size with direction"), "helper_size", &wr, this, 0)
+{
+ registerParameter(&fillet_chamfer_values);
+ registerParameter(&unit);
+ registerParameter(&method);
+ registerParameter(&radius);
+ registerParameter(&helper_size);
+ registerParameter(&flexible);
+ registerParameter(&use_knot_distance);
+ registerParameter(&ignore_radius_0);
+ registerParameter(&only_selected);
+ registerParameter(&hide_knots);
+
+ radius.param_set_range(0., infinity());
+ radius.param_set_increments(1, 1);
+ radius.param_set_digits(4);
+ helper_size.param_set_range(0, infinity());
+ helper_size.param_set_increments(5, 5);
+ helper_size.param_set_digits(0);
+}
+
+LPEFilletChamfer::~LPEFilletChamfer() {}
+
+Gtk::Widget *LPEFilletChamfer::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 = param->param_newWidget();
+ if (param->param_key == "radius") {
+ Inkscape::UI::Widget::Scalar *widgRegistered = Gtk::manage(dynamic_cast<Inkscape::UI::Widget::Scalar *>(widg));
+ widgRegistered->signal_value_changed().connect(sigc::mem_fun(*this, &LPEFilletChamfer::updateFillet));
+ widg = widgRegistered;
+ if (widg) {
+ Gtk::HBox *scalarParameter = dynamic_cast<Gtk::HBox *>(widg);
+ std::vector<Gtk::Widget *> childList = scalarParameter->get_children();
+ Gtk::Entry *entryWidg = dynamic_cast<Gtk::Entry *>(childList[1]);
+ entryWidg->set_width_chars(6);
+ }
+ } else if (param->param_key == "flexible") {
+ Gtk::CheckButton *widgRegistered = Gtk::manage(dynamic_cast<Gtk::CheckButton *>(widg));
+ widgRegistered->signal_clicked().connect(sigc::mem_fun(*this, &LPEFilletChamfer::toggleFlexFixed));
+ } else if (param->param_key == "helper_size") {
+ Inkscape::UI::Widget::Scalar *widgRegistered = Gtk::manage(dynamic_cast<Inkscape::UI::Widget::Scalar *>(widg));
+ widgRegistered->signal_value_changed().connect(sigc::mem_fun(*this, &LPEFilletChamfer::refreshKnots));
+ } else if (param->param_key == "hide_knots") {
+ Gtk::CheckButton *widgRegistered = Gtk::manage(dynamic_cast<Gtk::CheckButton *>(widg));
+ widgRegistered->signal_clicked().connect(sigc::mem_fun(*this, &LPEFilletChamfer::toggleHide));
+ } else if (param->param_key == "only_selected") {
+ Gtk::manage(widg);
+ } else if (param->param_key == "ignore_radius_0") {
+ Gtk::manage(widg);
+ }
+
+ Glib::ustring *tip = param->param_getTooltip();
+ if (widg) {
+ 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;
+ }
+
+ Gtk::HBox *filletButtonsContainer = Gtk::manage(new Gtk::HBox(true, 0));
+ Gtk::Button *fillet = Gtk::manage(new Gtk::Button(Glib::ustring(_("Fillet"))));
+ fillet->signal_clicked().connect(sigc::mem_fun(*this, &LPEFilletChamfer::fillet));
+
+ filletButtonsContainer->pack_start(*fillet, true, true, 2);
+ Gtk::Button *inverse = Gtk::manage(new Gtk::Button(Glib::ustring(_("Inverse fillet"))));
+ inverse->signal_clicked().connect(sigc::mem_fun(*this, &LPEFilletChamfer::inverse));
+ filletButtonsContainer->pack_start(*inverse, true, true, 2);
+
+ Gtk::HBox *chamferButtonsContainer = Gtk::manage(new Gtk::HBox(true, 0));
+ Gtk::Button *chamfer = Gtk::manage(new Gtk::Button(Glib::ustring(_("Chamfer"))));
+ chamfer->signal_clicked().connect(sigc::mem_fun(*this, &LPEFilletChamfer::chamfer));
+
+ chamferButtonsContainer->pack_start(*chamfer, true, true, 2);
+ Gtk::Button *doubleChamfer = Gtk::manage(new Gtk::Button(Glib::ustring(_("Double chamfer"))));
+ doubleChamfer->signal_clicked().connect(sigc::mem_fun(*this, &LPEFilletChamfer::doubleChamfer));
+ chamferButtonsContainer->pack_start(*doubleChamfer, true, true, 2);
+
+ vbox->pack_start(*filletButtonsContainer, true, true, 2);
+ vbox->pack_start(*chamferButtonsContainer, true, true, 2);
+
+ return vbox;
+}
+
+void LPEFilletChamfer::toggleHide()
+{
+ std::vector<Point> filletChamferData = fillet_chamfer_values.data();
+ std::vector<Geom::Point> result;
+ for (std::vector<Point>::const_iterator point_it = filletChamferData.begin();
+ point_it != filletChamferData.end(); ++point_it) {
+ if (hide_knots) {
+ result.push_back(Point((*point_it)[X], abs((*point_it)[Y]) * -1));
+ } else {
+ result.push_back(Point((*point_it)[X], abs((*point_it)[Y])));
+ }
+ }
+ fillet_chamfer_values.param_set_and_write_new_value(result);
+ refreshKnots();
+}
+
+void LPEFilletChamfer::toggleFlexFixed()
+{
+ std::vector<Point> filletChamferData = fillet_chamfer_values.data();
+ std::vector<Geom::Point> result;
+ unsigned int i = 0;
+ for (std::vector<Point>::const_iterator point_it = filletChamferData.begin();
+ point_it != filletChamferData.end(); ++point_it) {
+ if (flexible) {
+ result.push_back(Point(fillet_chamfer_values.to_time(i, (*point_it)[X]),
+ (*point_it)[Y]));
+ } else {
+ result.push_back(Point(fillet_chamfer_values.to_len(i, (*point_it)[X]),
+ (*point_it)[Y]));
+ }
+ i++;
+ }
+ if (flexible) {
+ radius.param_set_range(0., 100);
+ radius.param_set_value(0);
+ } else {
+ radius.param_set_range(0., infinity());
+ radius.param_set_value(0);
+ }
+ fillet_chamfer_values.param_set_and_write_new_value(result);
+}
+
+void LPEFilletChamfer::updateFillet()
+{
+ double power = 0;
+ if (!flexible) {
+ power = Inkscape::Util::Quantity::convert(radius, unit.get_abbreviation(), "px") * -1;
+ } else {
+ power = radius;
+ }
+ Piecewise<D2<SBasis> > const &pwd2 = fillet_chamfer_values.get_pwd2();
+ doUpdateFillet(path_from_piecewise(pwd2, tolerance), power);
+}
+
+void LPEFilletChamfer::fillet()
+{
+ Piecewise<D2<SBasis> > const &pwd2 = fillet_chamfer_values.get_pwd2();
+ doChangeType(path_from_piecewise(pwd2, tolerance), 1);
+}
+
+void LPEFilletChamfer::inverse()
+{
+ Piecewise<D2<SBasis> > const &pwd2 = fillet_chamfer_values.get_pwd2();
+ doChangeType(path_from_piecewise(pwd2, tolerance), 2);
+}
+
+void LPEFilletChamfer::chamfer()
+{
+ Piecewise<D2<SBasis> > const &pwd2 = fillet_chamfer_values.get_pwd2();
+ doChangeType(path_from_piecewise(pwd2, tolerance), 3);
+}
+
+void LPEFilletChamfer::doubleChamfer()
+{
+ Piecewise<D2<SBasis> > const &pwd2 = fillet_chamfer_values.get_pwd2();
+ doChangeType(path_from_piecewise(pwd2, tolerance), 4);
+}
+
+void LPEFilletChamfer::refreshKnots()
+{
+ Piecewise<D2<SBasis> > const &pwd2 = fillet_chamfer_values.get_pwd2();
+ fillet_chamfer_values.recalculate_knots(pwd2);
+ SPDesktop *desktop = inkscape_active_desktop();
+ if (tools_isactive(desktop, TOOLS_NODES)) {
+ tools_switch(desktop, TOOLS_SELECT);
+ tools_switch(desktop, TOOLS_NODES);
+ }
+}
+
+bool LPEFilletChamfer::nodeIsSelected(Geom::Point nodePoint, std::vector<Geom::Point> point)
+{
+ if (point.size() > 0) {
+ for (std::vector<Geom::Point>::iterator i = point.begin(); i != point.end();
+ ++i) {
+ Geom::Point p = *i;
+ if (Geom::are_near(p, nodePoint, 2)) {
+ return true;
+ }
+ }
+ }
+ return false;
+}
+void LPEFilletChamfer::doUpdateFillet(std::vector<Geom::Path> const& original_pathv, double power)
+{
+ std::vector<Geom::Point> point;
+ SPDesktop *desktop = inkscape_active_desktop();
+ if (INK_IS_NODE_TOOL(desktop->event_context)) {
+ Inkscape::UI::Tools::NodeTool *nodeTool = INK_NODE_TOOL(desktop->event_context);
+ Inkscape::UI::ControlPointSelection::Set &selection = nodeTool->_selected_nodes->allPoints();
+ std::vector<Geom::Point>::iterator pBegin;
+ for (Inkscape::UI::ControlPointSelection::Set::iterator i = selection.begin(); i != selection.end(); ++i) {
+ if ((*i)->selected()) {
+ Inkscape::UI::Node *n = dynamic_cast<Inkscape::UI::Node *>(*i);
+ pBegin = point.begin();
+ point.insert(pBegin, desktop->doc2dt(n->position()));
+ }
+ }
+ }
+ std::vector<Point> filletChamferData = fillet_chamfer_values.data();
+ std::vector<Geom::Point> result;
+ std::vector<Geom::Path> original_pathv_processed = pathv_to_linear_and_cubic_beziers(original_pathv);
+ int counter = 0;
+ for (PathVector::const_iterator path_it = original_pathv_processed.begin();
+ path_it != original_pathv_processed.end(); ++path_it) {
+ if (path_it->empty())
+ continue;
+
+ Geom::Path::const_iterator curve_it1 = path_it->begin();
+ Geom::Path::const_iterator curve_it2 = ++(path_it->begin());
+ Geom::Path::const_iterator curve_endit = path_it->end_default();
+ if (path_it->closed() && path_it->back_closed().isDegenerate()) {
+ const Curve &closingline = path_it->back_closed();
+ if (are_near(closingline.initialPoint(), closingline.finalPoint())) {
+ curve_endit = path_it->end_open();
+ }
+ }
+ double powerend = 0;
+ while (curve_it1 != curve_endit) {
+ powerend = power;
+ if (power < 0 && !use_knot_distance) {
+ powerend = fillet_chamfer_values.rad_to_len(counter,powerend);
+ }
+ if (power > 0) {
+ powerend = counter + (power / 100);
+ }
+ if (ignore_radius_0 && (filletChamferData[counter][X] == 0 ||
+ filletChamferData[counter][X] == counter)) {
+ powerend = filletChamferData[counter][X];
+ }
+ if (filletChamferData[counter][Y] == 0) {
+ powerend = filletChamferData[counter][X];
+ }
+ if (only_selected && !nodeIsSelected(curve_it1->initialPoint(), point)) {
+ powerend = filletChamferData[counter][X];
+ }
+ result.push_back(Point(powerend, filletChamferData[counter][Y]));
+ ++curve_it1;
+ ++curve_it2;
+ counter++;
+ }
+ }
+ fillet_chamfer_values.param_set_and_write_new_value(result);
+}
+
+void LPEFilletChamfer::doChangeType(std::vector<Geom::Path> const& original_pathv, int type)
+{
+ std::vector<Geom::Point> point;
+ SPDesktop *desktop = inkscape_active_desktop();
+ if (INK_IS_NODE_TOOL(desktop->event_context)) {
+ Inkscape::UI::Tools::NodeTool *nodeTool =
+ INK_NODE_TOOL(desktop->event_context);
+ Inkscape::UI::ControlPointSelection::Set &selection =
+ nodeTool->_selected_nodes->allPoints();
+ std::vector<Geom::Point>::iterator pBegin;
+ for (Inkscape::UI::ControlPointSelection::Set::iterator i =
+ selection.begin();
+ i != selection.end(); ++i) {
+ if ((*i)->selected()) {
+ Inkscape::UI::Node *n = dynamic_cast<Inkscape::UI::Node *>(*i);
+ pBegin = point.begin();
+ point.insert(pBegin, desktop->doc2dt(n->position()));
+ }
+ }
+ }
+ std::vector<Point> filletChamferData = fillet_chamfer_values.data();
+ std::vector<Geom::Point> result;
+ std::vector<Geom::Path> original_pathv_processed = pathv_to_linear_and_cubic_beziers(original_pathv);
+ int counter = 0;
+ for (PathVector::const_iterator path_it = original_pathv_processed.begin(); path_it != original_pathv_processed.end(); ++path_it) {
+ int pathCounter = 0;
+ if (path_it->empty())
+ continue;
+
+ Geom::Path::const_iterator curve_it1 = path_it->begin();
+ Geom::Path::const_iterator curve_it2 = ++(path_it->begin());
+ Geom::Path::const_iterator curve_endit = path_it->end_default();
+ if (path_it->closed() && path_it->back_closed().isDegenerate()) {
+ const Curve &closingline = path_it->back_closed();
+ if (are_near(closingline.initialPoint(), closingline.finalPoint())) {
+ curve_endit = path_it->end_open();
+ }
+ }
+ while (curve_it1 != curve_endit) {
+ bool toggle = true;
+ if (filletChamferData[counter][Y] == 0 ||
+ (ignore_radius_0 && (filletChamferData[counter][X] == 0 ||
+ filletChamferData[counter][X] == counter)) ||
+ (only_selected &&
+ !nodeIsSelected(curve_it1->initialPoint(), point))) {
+ toggle = false;
+ }
+ if (toggle) {
+ result.push_back(Point(filletChamferData[counter][X], type));
+ } else {
+ result.push_back(filletChamferData[counter]);
+ }
+ ++curve_it1;
+ if (curve_it2 != curve_endit) {
+ ++curve_it2;
+ }
+ counter++;
+ pathCounter++;
+ }
+ }
+ fillet_chamfer_values.param_set_and_write_new_value(result);
+}
+
+void LPEFilletChamfer::doOnApply(SPLPEItem const *lpeItem)
+{
+ if (SP_IS_SHAPE(lpeItem)) {
+ std::vector<Point> point;
+ PathVector const &original_pathv = pathv_to_linear_and_cubic_beziers(SP_SHAPE(lpeItem)->_curve->get_pathvector());
+ Piecewise<D2<SBasis> > pwd2_in = paths_to_pw(original_pathv);
+ for (PathVector::const_iterator path_it = original_pathv.begin(); path_it != original_pathv.end(); ++path_it) {
+ if (path_it->empty())
+ continue;
+
+ Geom::Path::const_iterator curve_it1 = path_it->begin();
+ Geom::Path::const_iterator curve_it2 = ++(path_it->begin());
+ Geom::Path::const_iterator curve_endit = path_it->end_default();
+ if (path_it->closed()) {
+ const Geom::Curve &closingline = path_it->back_closed();
+ // the closing line segment is always of type
+ // Geom::LineSegment.
+ if (are_near(closingline.initialPoint(), closingline.finalPoint())) {
+ // closingline.isDegenerate() did not work, because it only checks for
+ // *exact* zero length, which goes wrong for relative coordinates and
+ // rounding errors...
+ // the closing line segment has zero-length. So stop before that one!
+ curve_endit = path_it->end_open();
+ }
+ }
+ int counter = 0;
+ while (curve_it1 != curve_endit) {
+ std::pair<std::size_t, std::size_t> positions = fillet_chamfer_values.get_positions(counter, original_pathv);
+ Geom::NodeType nodetype;
+ if (positions.second == 0) {
+ if (path_it->closed()) {
+ Piecewise<D2<SBasis> > u;
+ u.push_cut(0);
+ u.push(pwd2_in[fillet_chamfer_values.last_index(counter, original_pathv)], 1);
+ Geom::Curve const * A = path_from_piecewise(u, 0.1)[0][0].duplicate();
+ nodetype = get_nodetype(*A, *curve_it1);
+ } else {
+ nodetype = NODE_NONE;
+ }
+ } else {
+ nodetype = get_nodetype((*path_it)[counter - 1], *curve_it1);
+ }
+ if (nodetype == NODE_CUSP) {
+ point.push_back(Point(0, 1));
+ } else {
+ point.push_back(Point(0, 0));
+ }
+ ++curve_it1;
+ if (curve_it2 != curve_endit) {
+ ++curve_it2;
+ }
+ counter++;
+ }
+ }
+ fillet_chamfer_values.param_set_and_write_new_value(point);
+ } else {
+ g_warning("LPE Fillet can only be applied to shapes (not groups).");
+ }
+}
+
+void LPEFilletChamfer::doBeforeEffect(SPLPEItem const *lpeItem)
+{
+ if (SP_IS_SHAPE(lpeItem)) {
+ if(hide_knots){
+ fillet_chamfer_values.set_helper_size(0);
+ } else {
+ fillet_chamfer_values.set_helper_size(helper_size);
+ }
+ fillet_chamfer_values.set_use_distance(use_knot_distance);
+ fillet_chamfer_values.set_unit(unit.get_abbreviation());
+ SPCurve *c = SP_IS_PATH(lpeItem) ? static_cast<SPPath const *>(lpeItem)
+ ->get_original_curve()
+ : SP_SHAPE(lpeItem)->getCurve();
+ std::vector<Point> filletChamferData = fillet_chamfer_values.data();
+ if (!filletChamferData.empty() && getKnotsNumber(c) != (int)
+ filletChamferData.size()) {
+ PathVector const original_pathv = pathv_to_linear_and_cubic_beziers(c->get_pathvector());
+ Piecewise<D2<SBasis> > pwd2_in = paths_to_pw(original_pathv);
+ fillet_chamfer_values.recalculate_controlpoints_for_new_pwd2(pwd2_in);
+ }
+ } else {
+ g_warning("LPE Fillet can only be applied to shapes (not groups).");
+ }
+}
+
+int LPEFilletChamfer::getKnotsNumber(SPCurve const *c)
+{
+ int nKnots = c->nodes_in_path();
+ PathVector const pv = pathv_to_linear_and_cubic_beziers(c->get_pathvector());
+ for (std::vector<Geom::Path>::const_iterator path_it = pv.begin();
+ path_it != pv.end(); ++path_it) {
+ if (!(*path_it).closed()) {
+ nKnots--;
+ }
+ }
+ return nKnots;
+}
+
+void
+LPEFilletChamfer::adjustForNewPath(std::vector<Geom::Path> const &path_in)
+{
+ if (!path_in.empty()) {
+ fillet_chamfer_values.recalculate_controlpoints_for_new_pwd2(pathv_to_linear_and_cubic_beziers(path_in)[0].toPwSb());
+ }
+}
+
+std::vector<Geom::Path>
+LPEFilletChamfer::doEffect_path(std::vector<Geom::Path> const &path_in)
+{
+ std::vector<Geom::Path> pathvector_out;
+ Piecewise<D2<SBasis> > pwd2_in = paths_to_pw(pathv_to_linear_and_cubic_beziers(path_in));
+ pwd2_in = remove_short_cuts(pwd2_in, .01);
+ Piecewise<D2<SBasis> > der = derivative(pwd2_in);
+ Piecewise<D2<SBasis> > n = rot90(unitVector(der));
+ fillet_chamfer_values.set_pwd2(pwd2_in, n);
+ std::vector<Point> filletChamferData = fillet_chamfer_values.data();
+ unsigned int counter = 0;
+ const double K = (4.0 / 3.0) * (sqrt(2.0) - 1.0);
+ std::vector<Geom::Path> path_in_processed = pathv_to_linear_and_cubic_beziers(path_in);
+ for (PathVector::const_iterator path_it = path_in_processed.begin();
+ path_it != path_in_processed.end(); ++path_it) {
+ if (path_it->empty())
+ continue;
+ Geom::Path path_out;
+ Geom::Path::const_iterator curve_it1 = path_it->begin();
+ Geom::Path::const_iterator curve_it2 = ++(path_it->begin());
+ Geom::Path::const_iterator curve_endit = path_it->end_default();
+ if (path_it->closed()) {
+ const Geom::Curve &closingline = path_it->back_closed();
+ // the closing line segment is always of type
+ // Geom::LineSegment.
+ if (are_near(closingline.initialPoint(), closingline.finalPoint())) {
+ // closingline.isDegenerate() did not work, because it only checks for
+ // *exact* zero length, which goes wrong for relative coordinates and
+ // rounding errors...
+ // the closing line segment has zero-length. So stop before that one!
+ curve_endit = path_it->end_open();
+ }
+ }
+ unsigned int counterCurves = 0;
+ while (curve_it1 != curve_endit) {
+ Curve *curve_it2Fixed = (*path_it->begin()).duplicate();
+ if(!path_it->closed() || curve_it2 != curve_endit){
+ curve_it2Fixed = (*curve_it2).duplicate();
+ }
+ bool last = curve_it2 == curve_endit;
+ std::vector<double> times = fillet_chamfer_values.get_times(counter, path_in, last);
+ Curve *knotCurve1 = curve_it1->portion(times[0], times[1]);
+ if (counterCurves > 0) {
+ knotCurve1->setInitial(path_out.finalPoint());
+ } else {
+ path_out.start((*curve_it1).pointAt(times[0]));
+ }
+ Curve *knotCurve2 = curve_it2Fixed->portion(times[2], 1);
+ Point startArcPoint = knotCurve1->finalPoint();
+ Point endArcPoint = curve_it2Fixed->pointAt(times[2]);
+ double k1 = distance(startArcPoint, curve_it1->finalPoint()) * K;
+ double k2 = distance(endArcPoint, curve_it1->finalPoint()) * K;
+ Geom::CubicBezier const *cubic1 = dynamic_cast<Geom::CubicBezier const *>(&*knotCurve1);
+ Ray ray1(startArcPoint, curve_it1->finalPoint());
+ if (cubic1) {
+ ray1.setPoints((*cubic1)[2], startArcPoint);
+ }
+ Point handle1 = Point::polar(ray1.angle(),k1) + startArcPoint;
+ Geom::CubicBezier const *cubic2 =
+ dynamic_cast<Geom::CubicBezier const *>(&*knotCurve2);
+ Ray ray2(curve_it1->finalPoint(), endArcPoint);
+ if (cubic2) {
+ ray2.setPoints(endArcPoint, (*cubic2)[1]);
+ }
+ Point handle2 = endArcPoint - Point::polar(ray2.angle(),k2);
+ bool ccwToggle = cross(curve_it1->finalPoint() - startArcPoint, endArcPoint - startArcPoint) < 0;
+ double angle = angle_between(ray1, ray2, ccwToggle);
+ double handleAngle = ray1.angle() - angle;
+ if (ccwToggle) {
+ handleAngle = ray1.angle() + angle;
+ }
+ Point inverseHandle1 = Point::polar(handleAngle,k1) + startArcPoint;
+ handleAngle = ray2.angle() + angle;
+ if (ccwToggle) {
+ handleAngle = ray2.angle() - angle;
+ }
+ Point inverseHandle2 = endArcPoint - Point::polar(handleAngle,k2);
+ //straigth lines arc based
+ Line const x_line(Geom::Point(0,0),Geom::Point(1,0));
+ Line const angled_line(startArcPoint,endArcPoint);
+ double angleArc = Geom::angle_between( x_line,angled_line);
+ double radius = Geom::distance(startArcPoint,middle_point(startArcPoint,endArcPoint))/sin(angle/2.0);
+ Coord rx = radius;
+ Coord ry = rx;
+
+ if (times[1] != 1) {
+ if (times[1] != gapHelper && times[1] != times[0] + gapHelper) {
+ path_out.append(*knotCurve1);
+ }
+ int type = 0;
+ if(path_it->closed() && last){
+ type = abs(filletChamferData[counter - counterCurves][Y]);
+ } else if (!path_it->closed() && last){
+ //0
+ } else {
+ type = abs(filletChamferData[counter + 1][Y]);
+ }
+ if (type == 3 || type == 4) {
+ if (type == 4) {
+ Geom::Point central = middle_point(startArcPoint, endArcPoint);
+ LineSegment chamferCenter(central, curve_it1->finalPoint());
+ path_out.appendNew<Geom::LineSegment>(chamferCenter.pointAt(0.5));
+ }
+ path_out.appendNew<Geom::LineSegment>(endArcPoint);
+ } else if (type == 2) {
+ if((is_straight_curve(*curve_it1) && is_straight_curve(*curve_it2Fixed) && method != FM_BEZIER )|| method == FM_ARC){
+ ccwToggle = ccwToggle?0:1;
+ path_out.appendNew<SVGEllipticalArc>(rx, ry, angleArc, 0, ccwToggle, endArcPoint);
+ }else{
+ path_out.appendNew<Geom::CubicBezier>(inverseHandle1, inverseHandle2, endArcPoint);
+ }
+ } else {
+ if((is_straight_curve(*curve_it1) && is_straight_curve(*curve_it2Fixed) && method != FM_BEZIER )|| method == FM_ARC){
+ path_out.appendNew<SVGEllipticalArc>(rx, ry, angleArc, 0, ccwToggle, endArcPoint);
+ } else {
+ path_out.appendNew<Geom::CubicBezier>(handle1, handle2, endArcPoint);
+ }
+ }
+ } else {
+ path_out.append(*knotCurve1);
+ }
+ if (path_it->closed() && last) {
+ path_out.close();
+ }
+ ++curve_it1;
+ if (curve_it2 != curve_endit) {
+ ++curve_it2;
+ }
+ counter++;
+ counterCurves++;
+ }
+ pathvector_out.push_back(path_out);
+ }
+ return pathvector_out;
+}
+
+}; //namespace LivePathEffect
+}; /* namespace Inkscape */
+
+/*
+ Local Variables:
+ mode:c++
+ c-file-style:"stroustrup"
+ c-file-offset:((innamespace . 0)(inline-open . 0)(case-label . +))
+ indent-tabs-mode:nil
+ fill-column:99
+ End:
+*/
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4 :
diff --git a/src/live_effects/lpe-fillet-chamfer.h b/src/live_effects/lpe-fillet-chamfer.h
new file mode 100644
index 000000000..873684101
--- /dev/null
+++ b/src/live_effects/lpe-fillet-chamfer.h
@@ -0,0 +1,101 @@
+#ifndef INKSCAPE_LPE_FILLET_CHAMFER_H
+#define INKSCAPE_LPE_FILLET_CHAMFER_H
+
+/*
+ * Author(s):
+ * Jabiertxo Arraiza Cenoz <jabier.arraiza@marker.es>
+ *
+ * Copyright (C) 2014 Author(s)
+ *
+ * Special thanks to Johan Engelen for the base of the effect -powerstroke-
+ * Also to ScislaC for point me to the idea
+ * Also su_v for his construvtive feedback and time
+ * and finaly to Liam P. White for his big help on coding, that save me a lot of hours
+ *
+ * Released under GNU GPL, read the file 'COPYING' for more information
+ */
+
+#if HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#if defined(GLIBMM_DISABLE_DEPRECATED) && defined(HAVE_GLIBMM_THREADS_H)
+# include <glibmm/threads.h>
+#endif
+
+#include "live_effects/parameter/enum.h"
+#include "live_effects/parameter/bool.h"
+#include "live_effects/parameter/unit.h"
+
+#include "live_effects/parameter/filletchamferpointarray.h"
+#include "live_effects/effect.h"
+
+namespace Inkscape {
+namespace LivePathEffect {
+
+enum FilletMethod {
+ FM_AUTO,
+ FM_ARC,
+ FM_BEZIER,
+ FM_END
+};
+
+class LPEFilletChamfer : public Effect {
+public:
+ LPEFilletChamfer(LivePathEffectObject *lpeobject);
+ virtual ~LPEFilletChamfer();
+
+ virtual std::vector<Geom::Path> doEffect_path(std::vector<Geom::Path> const &path_in);
+
+ virtual void doOnApply(SPLPEItem const *lpeItem);
+ virtual void doBeforeEffect(SPLPEItem const *lpeItem);
+ virtual void adjustForNewPath(std::vector<Geom::Path> const &path_in);
+ virtual Gtk::Widget* newWidget();
+
+ int getKnotsNumber(SPCurve const *c);
+ void toggleHide();
+ void toggleFlexFixed();
+ void chamfer();
+ void fillet();
+ void doubleChamfer();
+ void inverse();
+ void updateFillet();
+ void doUpdateFillet(std::vector<Geom::Path> const& original_pathv, double power);
+ void doChangeType(std::vector<Geom::Path> const& original_pathv, int type);
+ bool nodeIsSelected(Geom::Point nodePoint, std::vector<Geom::Point> points);
+ void refreshKnots();
+
+ FilletChamferPointArrayParam fillet_chamfer_values;
+
+private:
+
+ BoolParam hide_knots;
+ BoolParam ignore_radius_0;
+ BoolParam only_selected;
+ BoolParam flexible;
+ BoolParam use_knot_distance;
+ UnitParam unit;
+ EnumParam<FilletMethod> method;
+ ScalarParam radius;
+ ScalarParam helper_size;
+
+ LPEFilletChamfer(const LPEFilletChamfer &);
+ LPEFilletChamfer &operator=(const LPEFilletChamfer &);
+
+};
+
+} //namespace LivePathEffect
+} //namespace Inkscape
+
+#endif
+
+/*
+ Local Variables:
+ mode:c++
+ c-file-style:"stroustrup"
+ c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
+ indent-tabs-mode:nil
+ fill-column:99
+ End:
+*/
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4 :
diff --git a/src/live_effects/lpe-interpolate_points.cpp b/src/live_effects/lpe-interpolate_points.cpp
new file mode 100644
index 000000000..4ac139752
--- /dev/null
+++ b/src/live_effects/lpe-interpolate_points.cpp
@@ -0,0 +1,94 @@
+/** \file
+ * LPE interpolate_points implementation
+ * Interpolates between knots of the input path.
+ */
+/*
+ * Authors:
+ * Johan Engelen
+ *
+ * Copyright (C) Johan Engelen 2014 <j.b.c.engelen@alumnus.utwente.nl>
+ *
+ * Released under GNU GPL, read the file 'COPYING' for more information
+ */
+
+#include "live_effects/lpe-interpolate_points.h"
+
+#include <2geom/path.h>
+
+#include "live_effects/lpe-powerstroke-interpolators.h"
+
+namespace Inkscape {
+namespace LivePathEffect {
+
+
+static const Util::EnumData<unsigned> InterpolatorTypeData[] = {
+ {Geom::Interpolate::INTERP_LINEAR , N_("Linear"), "Linear"},
+ {Geom::Interpolate::INTERP_CUBICBEZIER , N_("CubicBezierFit"), "CubicBezierFit"},
+ {Geom::Interpolate::INTERP_CUBICBEZIER_JOHAN , N_("CubicBezierJohan"), "CubicBezierJohan"},
+ {Geom::Interpolate::INTERP_SPIRO , N_("SpiroInterpolator"), "SpiroInterpolator"},
+ {Geom::Interpolate::INTERP_CENTRIPETAL_CATMULLROM, N_("Centripetal Catmull-Rom"), "CentripetalCatmullRom"}
+};
+static const Util::EnumDataConverter<unsigned> InterpolatorTypeConverter(InterpolatorTypeData, sizeof(InterpolatorTypeData)/sizeof(*InterpolatorTypeData));
+
+
+LPEInterpolatePoints::LPEInterpolatePoints(LivePathEffectObject *lpeobject)
+ : Effect(lpeobject)
+ , interpolator_type(
+ _("Interpolator type:"),
+ _("Determines which kind of interpolator will be used to interpolate between stroke width along the path"),
+ "interpolator_type", InterpolatorTypeConverter, &wr, this, Geom::Interpolate::INTERP_CENTRIPETAL_CATMULLROM)
+{
+ show_orig_path = false;
+
+ registerParameter( &interpolator_type );
+}
+
+LPEInterpolatePoints::~LPEInterpolatePoints()
+{
+}
+
+
+Geom::PathVector
+LPEInterpolatePoints::doEffect_path (Geom::PathVector const & path_in)
+{
+ Geom::PathVector path_out;
+
+ std::auto_ptr<Geom::Interpolate::Interpolator> interpolator( Geom::Interpolate::Interpolator::create(static_cast<Geom::Interpolate::InterpolatorType>(interpolator_type.get_value())) );
+
+ for(Geom::PathVector::const_iterator path_it = path_in.begin(); path_it != path_in.end(); ++path_it) {
+ if (path_it->empty())
+ continue;
+
+ if (path_it->closed()) {
+ g_warning("Interpolate points LPE currently ignores whether path is closed or not.");
+ }
+
+ std::vector<Geom::Point> pts;
+ pts.push_back(path_it->initialPoint());
+
+ for (Geom::Path::const_iterator it = path_it->begin(), e = path_it->end_default(); it != e; ++it) {
+ pts.push_back((*it).finalPoint());
+ }
+
+ Geom::Path path = interpolator->interpolateToPath(pts);
+
+ path_out.push_back(path);
+ }
+
+ return path_out;
+}
+
+
+} //namespace LivePathEffect
+} /* namespace Inkscape */
+
+/*
+ Local Variables:
+ mode:c++
+ c-file-style:"stroustrup"
+ c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
+ indent-tabs-mode:nil
+ fill-column:99
+ End:
+*/
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4 :
diff --git a/src/live_effects/lpe-interpolate_points.h b/src/live_effects/lpe-interpolate_points.h
new file mode 100644
index 000000000..7a3364747
--- /dev/null
+++ b/src/live_effects/lpe-interpolate_points.h
@@ -0,0 +1,51 @@
+#ifndef INKSCAPE_LPE_INTERPOLATEPOINTS_H
+#define INKSCAPE_LPE_INTERPOLATEPOINTS_H
+
+/** \file
+ * LPE interpolate_points implementation, see lpe-interpolate_points.cpp.
+ */
+
+/*
+ * Authors:
+ * Johan Engelen
+ *
+ * Copyright (C) Johan Engelen 2014 <j.b.c.engelen@alumnus.utwente.nl>
+ *
+ * Released under GNU GPL, read the file 'COPYING' for more information
+ */
+
+#include "live_effects/parameter/enum.h"
+#include "live_effects/effect.h"
+
+namespace Inkscape {
+namespace LivePathEffect {
+
+class LPEInterpolatePoints : public Effect {
+public:
+ LPEInterpolatePoints(LivePathEffectObject *lpeobject);
+ virtual ~LPEInterpolatePoints();
+
+ virtual std::vector<Geom::Path> doEffect_path (std::vector<Geom::Path> const & path_in);
+
+private:
+ EnumParam<unsigned> interpolator_type;
+
+ LPEInterpolatePoints(const LPEInterpolatePoints&);
+ LPEInterpolatePoints& operator=(const LPEInterpolatePoints&);
+};
+
+} //namespace LivePathEffect
+} //namespace Inkscape
+
+#endif // INKSCAPE_LPE_INTERPOLATEPOINTS_H
+
+/*
+ Local Variables:
+ mode:c++
+ c-file-style:"stroustrup"
+ c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
+ indent-tabs-mode:nil
+ fill-column:99
+ End:
+*/
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4 :
diff --git a/src/live_effects/lpe-jointype.cpp b/src/live_effects/lpe-jointype.cpp
new file mode 100644
index 000000000..bf2526986
--- /dev/null
+++ b/src/live_effects/lpe-jointype.cpp
@@ -0,0 +1,190 @@
+/* Authors:
+*
+* Liam P White
+*
+* Copyright (C) 2014 Authors
+*
+* Released under GNU GPL v2, read the file 'COPYING' for more information
+*/
+
+#include "live_effects/parameter/enum.h"
+#include "live_effects/pathoutlineprovider.h"
+
+#include "sp-shape.h"
+#include "style.h"
+#include "xml/repr.h"
+#include "sp-paint-server.h"
+#include "svg/svg-color.h"
+#include "desktop-style.h"
+#include "svg/css-ostringstream.h"
+#include "display/curve.h"
+
+#include <2geom/path.h>
+#include <2geom/svg-elliptical-arc.h>
+
+#include "lpe-jointype.h"
+
+namespace Inkscape {
+namespace LivePathEffect {
+
+static const Util::EnumData<unsigned> JoinTypeData[] = {
+ {LINEJOIN_STRAIGHT, N_("Beveled"), "bevel"},
+ {LINEJOIN_ROUND, N_("Rounded"), "round"},
+ {LINEJOIN_POINTY, N_("Miter"), "miter"},
+ {LINEJOIN_REFLECTED, N_("Reflected"), "extrapolated"},
+ {LINEJOIN_EXTRAPOLATED, N_("Extrapolated arc"), "extrp_arc"}
+};
+
+static const Util::EnumData<unsigned> CapTypeData[] = {
+ {BUTT_STRAIGHT, N_("Butt"), "butt"},
+ {BUTT_ROUND, N_("Rounded"), "round"},
+ {BUTT_SQUARE, N_("Square"), "square"},
+ {BUTT_POINTY, N_("Peak"), "peak"},
+ {BUTT_LEANED, N_("Leaned"), "leaned"}
+};
+
+static const Util::EnumDataConverter<unsigned> CapTypeConverter(CapTypeData, sizeof(CapTypeData)/sizeof(*CapTypeData));
+static const Util::EnumDataConverter<unsigned> JoinTypeConverter(JoinTypeData, sizeof(JoinTypeData)/sizeof(*JoinTypeData));
+
+LPEJoinType::LPEJoinType(LivePathEffectObject *lpeobject) :
+ Effect(lpeobject),
+ line_width(_("Line width"), _("Thickness of the stroke"), "line_width", &wr, this, 1.),
+ linecap_type(_("Line cap"), _("The end shape of the stroke"), "linecap_type", CapTypeConverter, &wr, this, butt_straight),
+ linejoin_type(_("Join:"), _("Determines the shape of the path's corners"), "linejoin_type", JoinTypeConverter, &wr, this, LINEJOIN_EXTRAPOLATED),
+ start_lean(_("Start path lean"), _("Start path lean"), "start_lean", &wr, this, 0.),
+ end_lean(_("End path lean"), _("End path lean"), "end_lean", &wr, this, 0.),
+ miter_limit(_("Miter limit:"), _("Maximum length of the miter join (in units of stroke width)"), "miter_limit", &wr, this, 100.),
+ attempt_force_join(_("Force miter"), _("Overrides the miter limit and forces a join."), "attempt_force_join", &wr, this, true)
+{
+ show_orig_path = true;
+ registerParameter(&linecap_type);
+ registerParameter(&line_width);
+ registerParameter(&linejoin_type);
+ registerParameter(&start_lean);
+ registerParameter(&end_lean);
+ registerParameter(&miter_limit);
+ registerParameter(&attempt_force_join);
+ was_initialized = false;
+ start_lean.param_set_range(-1,1);
+ start_lean.param_set_increments(0.1, 0.1);
+ start_lean.param_set_digits(4);
+ end_lean.param_set_range(-1,1);
+ end_lean.param_set_increments(0.1, 0.1);
+ end_lean.param_set_digits(4);
+}
+
+LPEJoinType::~LPEJoinType()
+{
+}
+
+//from LPEPowerStroke -- sets fill if stroke color because we will
+//be converting to a fill to make the new join.
+
+void LPEJoinType::doOnApply(SPLPEItem const* lpeitem)
+{
+ if (SP_IS_SHAPE(lpeitem)) {
+ SPLPEItem* item = const_cast<SPLPEItem*>(lpeitem);
+ double width = (lpeitem && lpeitem->style) ? lpeitem->style->stroke_width.computed : 1.;
+
+ SPCSSAttr *css = sp_repr_css_attr_new ();
+ if (true) {
+ if (lpeitem->style->stroke.isPaintserver()) {
+ SPPaintServer * server = lpeitem->style->getStrokePaintServer();
+ if (server) {
+ Glib::ustring str;
+ str += "url(#";
+ str += server->getId();
+ str += ")";
+ sp_repr_css_set_property (css, "fill", str.c_str());
+ }
+ } else if (lpeitem->style->stroke.isColor()) {
+ gchar c[64];
+ sp_svg_write_color (c, sizeof(c), lpeitem->style->stroke.value.color.toRGBA32(SP_SCALE24_TO_FLOAT(lpeitem->style->stroke_opacity.value)));
+ sp_repr_css_set_property (css, "fill", c);
+ } else {
+ sp_repr_css_set_property (css, "fill", "none");
+ }
+ } else {
+ sp_repr_css_unset_property (css, "fill");
+ }
+
+ sp_repr_css_set_property(css, "stroke", "none");
+
+ sp_desktop_apply_css_recursive(item, css, true);
+ sp_repr_css_attr_unref (css);
+ if (!was_initialized)
+ {
+ was_initialized = true;
+ line_width.param_set_value(width);
+ }
+ } else {
+ g_warning("LPE Join Type can only be applied to paths (not groups).");
+ }
+}
+
+//from LPEPowerStroke -- sets stroke color from existing fill color
+
+void LPEJoinType::doOnRemove(SPLPEItem const* lpeitem)
+{
+
+ if (SP_IS_SHAPE(lpeitem)) {
+ SPLPEItem *item = const_cast<SPLPEItem*>(lpeitem);
+
+ SPCSSAttr *css = sp_repr_css_attr_new ();
+ if (true) {
+ if (lpeitem->style->fill.isPaintserver()) {
+ SPPaintServer * server = lpeitem->style->getFillPaintServer();
+ if (server) {
+ Glib::ustring str;
+ str += "url(#";
+ str += server->getId();
+ str += ")";
+ sp_repr_css_set_property (css, "stroke", str.c_str());
+ }
+ } else if (lpeitem->style->fill.isColor()) {
+ gchar c[64];
+ sp_svg_write_color (c, sizeof(c), lpeitem->style->stroke.value.color.toRGBA32(SP_SCALE24_TO_FLOAT(lpeitem->style->stroke_opacity.value)));
+ sp_repr_css_set_property (css, "stroke", c);
+ } else {
+ sp_repr_css_set_property (css, "stroke", "none");
+ }
+ } else {
+ sp_repr_css_unset_property (css, "stroke");
+ }
+
+ Inkscape::CSSOStringStream os;
+ os << fabs(line_width);
+ sp_repr_css_set_property (css, "stroke-width", os.str().c_str());
+
+ sp_repr_css_set_property(css, "fill", "none");
+
+ sp_desktop_apply_css_recursive(item, css, true);
+ sp_repr_css_attr_unref (css);
+ item->updateRepr();
+ }
+}
+
+// NOTE: I originally had all the outliner functions defined in here, but they were actually useful
+// enough for other LPEs so I moved them all into pathoutlineprovider.cpp. The code here is just a
+// wrapper around it.
+std::vector<Geom::Path> LPEJoinType::doEffect_path(std::vector<Geom::Path> const & path_in)
+{
+ return Outline::PathVectorOutline(path_in, line_width, static_cast<ButtTypeMod>(linecap_type.get_value()),
+ static_cast<LineJoinType>(linejoin_type.get_value()),
+ (attempt_force_join ? std::numeric_limits<double>::max() : miter_limit),
+ start_lean/2 ,end_lean/2);
+}
+
+} // namespace LivePathEffect
+} // namespace Inkscape
+
+/*
+ Local Variables:
+ mode:c++
+ c-file-style:"stroustrup"
+ c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
+ indent-tabs-mode:nil
+ fill-column:99
+ End:
+*/
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8 :
diff --git a/src/live_effects/lpe-jointype.h b/src/live_effects/lpe-jointype.h
new file mode 100644
index 000000000..73705666d
--- /dev/null
+++ b/src/live_effects/lpe-jointype.h
@@ -0,0 +1,57 @@
+/* Authors:
+ * Liam P White
+ *
+ * Copyright (C) 2014 Authors
+ *
+ * Released under GNU GPL v2, read the file COPYING for more information
+ */
+
+#ifndef INKSCAPE_LPE_JOINTYPE_H
+#define INKSCAPE_LPE_JOINTYPE_H
+
+#include "live_effects/effect.h"
+#include "live_effects/parameter/parameter.h"
+#include "live_effects/parameter/point.h"
+#include "live_effects/parameter/enum.h"
+
+namespace Inkscape {
+namespace LivePathEffect {
+
+class LPEJoinType : public Effect {
+public:
+ LPEJoinType(LivePathEffectObject *lpeobject);
+ virtual ~LPEJoinType();
+
+ virtual void doOnApply(SPLPEItem const* lpeitem);
+ virtual void doOnRemove(SPLPEItem const* lpeitem);
+ virtual std::vector <Geom::Path> doEffect_path (std::vector<Geom::Path> const & path_in);
+
+private:
+ LPEJoinType(const LPEJoinType&);
+ LPEJoinType& operator=(const LPEJoinType&);
+
+ ScalarParam line_width;
+ EnumParam<unsigned> linecap_type;
+ EnumParam<unsigned> linejoin_type;
+ ScalarParam start_lean;
+ ScalarParam end_lean;
+ ScalarParam miter_limit;
+ BoolParam attempt_force_join;
+ bool was_initialized;
+};
+
+} //namespace LivePathEffect
+} //namespace Inkscape
+
+#endif
+
+/*
+ Local Variables:
+ mode:c++
+ c-file-style:"stroustrup"
+ c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
+ indent-tabs-mode:nil
+ fill-column:99
+ End:
+*/
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8 :
diff --git a/src/live_effects/lpe-knot.cpp b/src/live_effects/lpe-knot.cpp
index cac3a9347..3876aa24b 100644
--- a/src/live_effects/lpe-knot.cpp
+++ b/src/live_effects/lpe-knot.cpp
@@ -22,6 +22,7 @@
#include "knotholder.h"
#include <glibmm/i18n.h>
+#include <gdk/gdk.h>
#include <2geom/sbasis-to-bezier.h>
#include <2geom/sbasis.h>
@@ -536,6 +537,10 @@ LPEKnot::doBeforeEffect (SPLPEItem const* lpeitem)
{
using namespace Geom;
original_bbox(lpeitem);
+
+ if (SP_IS_PATH(lpeitem)) {
+ supplied_path = SP_PATH(lpeitem)->getCurve()->get_pathvector();
+ }
gpaths.clear();
gstroke_widths.clear();
diff --git a/src/live_effects/lpe-knot.h b/src/live_effects/lpe-knot.h
index f926bf085..080f32de2 100644
--- a/src/live_effects/lpe-knot.h
+++ b/src/live_effects/lpe-knot.h
@@ -64,7 +64,8 @@ public:
void addKnotHolderEntities(KnotHolder *knotholder, SPDesktop *desktop, SPItem *item);
protected:
- virtual void addCanvasIndicators(SPLPEItem const *lpeitem, std::vector<Geom::PathVector> &hp_vec);
+ virtual void addCanvasIndicators(SPLPEItem const *lpeitem, std::vector<Geom::PathVector> &hp_vec);
+ std::vector<Geom::Path> supplied_path; //for knotholder business
private:
void updateSwitcher();
diff --git a/src/live_effects/lpe-lattice.cpp b/src/live_effects/lpe-lattice.cpp
index 8136569e8..a241a8a2e 100644
--- a/src/live_effects/lpe-lattice.cpp
+++ b/src/live_effects/lpe-lattice.cpp
@@ -176,6 +176,9 @@ void
LPELattice::doBeforeEffect (SPLPEItem const* lpeitem)
{
original_bbox(lpeitem);
+ SPLPEItem * item = const_cast<SPLPEItem*>(lpeitem);
+ item->apply_to_clippath(item);
+ item->apply_to_mask(item);
}
void
diff --git a/src/live_effects/lpe-lattice.h b/src/live_effects/lpe-lattice.h
index a44dda3fd..5eb48909b 100644
--- a/src/live_effects/lpe-lattice.h
+++ b/src/live_effects/lpe-lattice.h
@@ -58,7 +58,6 @@ private:
PointParam grid_point13;
PointParam grid_point14;
PointParam grid_point15;
-
LPELattice(const LPELattice&);
LPELattice& operator=(const LPELattice&);
};
diff --git a/src/live_effects/lpe-lattice2.cpp b/src/live_effects/lpe-lattice2.cpp
new file mode 100644
index 000000000..8fadd79ed
--- /dev/null
+++ b/src/live_effects/lpe-lattice2.cpp
@@ -0,0 +1,499 @@
+/** \file
+ * LPE <lattice2> implementation
+
+ */
+/*
+ * Authors:
+ * Johan Engelen <j.b.c.engelen@utwente.nl>
+ * Steren Giannini
+ * Noé Falzon
+ * Victor Navez
+ * ~suv
+ * Jabiertxo Arraiza
+*
+* Copyright (C) 2007-2008 Authors
+ *
+ * Released under GNU GPL, read the file 'COPYING' for more information
+ */
+
+#include "live_effects/lpe-lattice2.h"
+
+#include "sp-shape.h"
+#include "sp-item.h"
+#include "sp-path.h"
+#include "display/curve.h"
+#include "svg/svg.h"
+
+#include <2geom/sbasis.h>
+#include <2geom/sbasis-2d.h>
+#include <2geom/sbasis-geometric.h>
+#include <2geom/bezier-to-sbasis.h>
+#include <2geom/sbasis-to-bezier.h>
+#include <2geom/d2.h>
+#include <2geom/piecewise.h>
+#include <2geom/transforms.h>
+#include "ui/tools-switch.h"
+
+#include "desktop.h" // TODO: should be factored out (see below)
+
+using namespace Geom;
+
+namespace Inkscape {
+namespace LivePathEffect {
+
+LPELattice2::LPELattice2(LivePathEffectObject *lpeobject) :
+ Effect(lpeobject),
+ // initialise your parameters here:
+ grid_point0(_("Control handle 0:"), _("Control handle 0 - Ctrl+Alt+Click to reset"), "gridpoint0", &wr, this),
+ grid_point1(_("Control handle 1:"), _("Control handle 1 - Ctrl+Alt+Click to reset"), "gridpoint1", &wr, this),
+ grid_point2(_("Control handle 2:"), _("Control handle 2 - Ctrl+Alt+Click to reset"), "gridpoint2", &wr, this),
+ grid_point3(_("Control handle 3:"), _("Control handle 3 - Ctrl+Alt+Click to reset"), "gridpoint3", &wr, this),
+ grid_point4(_("Control handle 4:"), _("Control handle 4 - Ctrl+Alt+Click to reset"), "gridpoint4", &wr, this),
+ grid_point5(_("Control handle 5:"), _("Control handle 5 - Ctrl+Alt+Click to reset"), "gridpoint5", &wr, this),
+ grid_point6(_("Control handle 6:"), _("Control handle 6 - Ctrl+Alt+Click to reset"), "gridpoint6", &wr, this),
+ grid_point7(_("Control handle 7:"), _("Control handle 7 - Ctrl+Alt+Click to reset"), "gridpoint7", &wr, this),
+ grid_point8x9(_("Control handle 8x9:"), _("Control handle 8x9 - Ctrl+Alt+Click to reset"), "gridpoint8x9", &wr, this),
+ grid_point10x11(_("Control handle 10x11:"), _("Control handle 10x11 - Ctrl+Alt+Click to reset"), "gridpoint10x11", &wr, this),
+ grid_point12(_("Control handle 12:"), _("Control handle 12 - Ctrl+Alt+Click to reset"), "gridpoint12", &wr, this),
+ grid_point13(_("Control handle 13:"), _("Control handle 13 - Ctrl+Alt+Click to reset"), "gridpoint13", &wr, this),
+ grid_point14(_("Control handle 14:"), _("Control handle 14 - Ctrl+Alt+Click to reset"), "gridpoint14", &wr, this),
+ grid_point15(_("Control handle 15:"), _("Control handle 15 - Ctrl+Alt+Click to reset"), "gridpoint15", &wr, this),
+ grid_point16(_("Control handle 16:"), _("Control handle 16 - Ctrl+Alt+Click to reset"), "gridpoint16", &wr, this),
+ grid_point17(_("Control handle 17:"), _("Control handle 17 - Ctrl+Alt+Click to reset"), "gridpoint17", &wr, this),
+ grid_point18(_("Control handle 18:"), _("Control handle 18 - Ctrl+Alt+Click to reset"), "gridpoint18", &wr, this),
+ grid_point19(_("Control handle 19:"), _("Control handle 19 - Ctrl+Alt+Click to reset"), "gridpoint19", &wr, this),
+ grid_point20x21(_("Control handle 20x21:"), _("Control handle 20x21 - Ctrl+Alt+Click to reset"), "gridpoint20x21", &wr, this),
+ grid_point22x23(_("Control handle 22x23:"), _("Control handle 22x23 - Ctrl+Alt+Click to reset"), "gridpoint22x23", &wr, this),
+ grid_point24x26(_("Control handle 24x26:"), _("Control handle 24x26 - Ctrl+Alt+Click to reset"), "gridpoint24x26", &wr, this),
+ grid_point25x27(_("Control handle 25x27:"), _("Control handle 25x27 - Ctrl+Alt+Click to reset"), "gridpoint25x27", &wr, this),
+ grid_point28x30(_("Control handle 28x30:"), _("Control handle 28x30 - Ctrl+Alt+Click to reset"), "gridpoint28x30", &wr, this),
+ grid_point29x31(_("Control handle 29x31:"), _("Control handle 29x31 - Ctrl+Alt+Click to reset"), "gridpoint29x31", &wr, this),
+ grid_point32x33x34x35(_("Control handle 32x33x34x35:"), _("Control handle 32x33x34x35 - Ctrl+Alt+Click to reset"), "gridpoint32x33x34x35", &wr, this)
+
+
+{
+ // register all your parameters here, so Inkscape knows which parameters this effect has:
+ registerParameter( dynamic_cast<Parameter *>(&grid_point0) );
+ registerParameter( dynamic_cast<Parameter *>(&grid_point1) );
+ registerParameter( dynamic_cast<Parameter *>(&grid_point2) );
+ registerParameter( dynamic_cast<Parameter *>(&grid_point3) );
+ registerParameter( dynamic_cast<Parameter *>(&grid_point4) );
+ registerParameter( dynamic_cast<Parameter *>(&grid_point5) );
+ registerParameter( dynamic_cast<Parameter *>(&grid_point6) );
+ registerParameter( dynamic_cast<Parameter *>(&grid_point7) );
+ registerParameter( dynamic_cast<Parameter *>(&grid_point8x9) );
+ registerParameter( dynamic_cast<Parameter *>(&grid_point10x11) );
+ registerParameter( dynamic_cast<Parameter *>(&grid_point12) );
+ registerParameter( dynamic_cast<Parameter *>(&grid_point13) );
+ registerParameter( dynamic_cast<Parameter *>(&grid_point14) );
+ registerParameter( dynamic_cast<Parameter *>(&grid_point15) );
+ registerParameter( dynamic_cast<Parameter *>(&grid_point16) );
+ registerParameter( dynamic_cast<Parameter *>(&grid_point17) );
+ registerParameter( dynamic_cast<Parameter *>(&grid_point18) );
+ registerParameter( dynamic_cast<Parameter *>(&grid_point19) );
+ registerParameter( dynamic_cast<Parameter *>(&grid_point20x21) );
+ registerParameter( dynamic_cast<Parameter *>(&grid_point22x23) );
+ registerParameter( dynamic_cast<Parameter *>(&grid_point24x26) );
+ registerParameter( dynamic_cast<Parameter *>(&grid_point25x27) );
+ registerParameter( dynamic_cast<Parameter *>(&grid_point28x30) );
+ registerParameter( dynamic_cast<Parameter *>(&grid_point29x31) );
+ registerParameter( dynamic_cast<Parameter *>(&grid_point32x33x34x35) );
+}
+
+LPELattice2::~LPELattice2()
+{
+}
+
+Geom::Piecewise<Geom::D2<Geom::SBasis> >
+LPELattice2::doEffect_pwd2 (Geom::Piecewise<Geom::D2<Geom::SBasis> > const & pwd2_in)
+{
+ D2<SBasis2d> sb2;
+
+ //Initialisation of the sb2
+ for(unsigned dim = 0; dim < 2; dim++) {
+ sb2[dim].us = 3;
+ sb2[dim].vs = 3;
+ const int depth = sb2[dim].us*sb2[dim].vs;
+ sb2[dim].resize(depth, Linear2d(0));
+ }
+
+ //Grouping the point params in a convenient vector
+ std::vector<Geom::Point *> handles(36);
+
+ handles[0] = &grid_point0;
+ handles[1] = &grid_point1;
+ handles[2] = &grid_point2;
+ handles[3] = &grid_point3;
+ handles[4] = &grid_point4;
+ handles[5] = &grid_point5;
+ handles[6] = &grid_point6;
+ handles[7] = &grid_point7;
+ handles[8] = &grid_point8x9;
+ handles[9] = &grid_point8x9;
+ handles[10] = &grid_point10x11;
+ handles[11] = &grid_point10x11;
+ handles[12] = &grid_point12;
+ handles[13] = &grid_point13;
+ handles[14] = &grid_point14;
+ handles[15] = &grid_point15;
+ handles[16] = &grid_point16;
+ handles[17] = &grid_point17;
+ handles[18] = &grid_point18;
+ handles[19] = &grid_point19;
+ handles[20] = &grid_point20x21;
+ handles[21] = &grid_point20x21;
+ handles[22] = &grid_point22x23;
+ handles[23] = &grid_point22x23;
+ handles[24] = &grid_point24x26;
+ handles[25] = &grid_point25x27;
+ handles[26] = &grid_point24x26;
+ handles[27] = &grid_point25x27;
+ handles[28] = &grid_point28x30;
+ handles[29] = &grid_point29x31;
+ handles[30] = &grid_point28x30;
+ handles[31] = &grid_point29x31;
+ handles[32] = &grid_point32x33x34x35;
+ handles[33] = &grid_point32x33x34x35;
+ handles[34] = &grid_point32x33x34x35;
+ handles[35] = &grid_point32x33x34x35;
+
+ Geom::Point origin = Geom::Point(boundingbox_X.min(),boundingbox_Y.min());
+
+ double width = boundingbox_X.extent();
+ double height = boundingbox_Y.extent();
+
+ //numbering is based on 4 rectangles.16
+ for(unsigned dim = 0; dim < 2; dim++) {
+ Geom::Point dir(0,0);
+ dir[dim] = 1;
+ for(unsigned vi = 0; vi < sb2[dim].vs; vi++) {
+ for(unsigned ui = 0; ui < sb2[dim].us; ui++) {
+ for(unsigned iv = 0; iv < 2; iv++) {
+ for(unsigned iu = 0; iu < 2; iu++) {
+ unsigned corner = iu + 2*iv;
+ unsigned i = ui + vi*sb2[dim].us;
+
+ //This is the offset from the Upperleft point
+ Geom::Point base( (ui + iu*(4-2*ui))*width/4.,
+ (vi + iv*(4-2*vi))*height/4.);
+
+ //Special action for corners
+ if(vi == 0 && ui == 0) {
+ base = Geom::Point(0,0);
+ }
+
+ // i = Upperleft corner of the considerated rectangle
+ // corner = actual corner of the rectangle
+ // origin = Upperleft point
+ double dl = dot((*handles[corner+4*i] - (base + origin)), dir)/dot(dir,dir);
+ sb2[dim][i][corner] = dl/( dim ? height : width )*pow(4.0,ui+vi);
+ }
+ }
+ }
+ }
+ }
+
+ Piecewise<D2<SBasis> > output;
+ output.push_cut(0.);
+ for(unsigned i = 0; i < pwd2_in.size(); i++) {
+ D2<SBasis> B = pwd2_in[i];
+ B[Geom::X] -= origin[Geom::X];
+ B[Geom::X]*= 1/width;
+ B[Geom::Y] -= origin[Geom::Y];
+ B[Geom::Y]*= 1/height;
+ //Here comes the magic
+ D2<SBasis> tB = compose_each(sb2,B);
+ tB[Geom::X] = tB[Geom::X] * width + origin[Geom::X];
+ tB[Geom::Y] = tB[Geom::Y] * height + origin[Geom::Y];
+
+ output.push(tB,i+1);
+ }
+ return output;
+}
+
+Gtk::Widget *
+LPELattice2::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);
+ Gtk::Button* resetButton = Gtk::manage(new Gtk::Button(Glib::ustring(_("Reset grid"))));
+ resetButton->set_alignment(0.0, 0.5);
+ resetButton->signal_clicked().connect(sigc::mem_fun (*this,&LPELattice2::resetGrid));
+ Gtk::Widget* resetButtonWidget = dynamic_cast<Gtk::Widget *>(resetButton);
+ resetButtonWidget->set_tooltip_text("Reset grid");
+ vbox->pack_start(*resetButtonWidget, true, true,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());
+ if(param->param_key == "grid"){
+ widg = NULL;
+ }
+ Glib::ustring * tip = param->param_getTooltip();
+ if (widg) {
+ 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
+LPELattice2::doBeforeEffect (SPLPEItem const* lpeitem)
+{
+ original_bbox(lpeitem);
+ setDefaults();
+ SPLPEItem * item = const_cast<SPLPEItem*>(lpeitem);
+ item->apply_to_clippath(item);
+ item->apply_to_mask(item);
+}
+
+void
+LPELattice2::setDefaults()
+{
+ Geom::Point gp0((boundingbox_X.max()-boundingbox_X.min())/4*0+boundingbox_X.min(),
+ (boundingbox_Y.max()-boundingbox_Y.min())/4*0+boundingbox_Y.min());
+
+ Geom::Point gp1((boundingbox_X.max()-boundingbox_X.min())/4*4+boundingbox_X.min(),
+ (boundingbox_Y.max()-boundingbox_Y.min())/4*0+boundingbox_Y.min());
+
+ Geom::Point gp2((boundingbox_X.max()-boundingbox_X.min())/4*0+boundingbox_X.min(),
+ (boundingbox_Y.max()-boundingbox_Y.min())/4*4+boundingbox_Y.min());
+
+ Geom::Point gp3((boundingbox_X.max()-boundingbox_X.min())/4*4+boundingbox_X.min(),
+ (boundingbox_Y.max()-boundingbox_Y.min())/4*4+boundingbox_Y.min());
+
+ Geom::Point gp4((boundingbox_X.max()-boundingbox_X.min())/4*1+boundingbox_X.min(),
+ (boundingbox_Y.max()-boundingbox_Y.min())/4*0+boundingbox_Y.min());
+
+ Geom::Point gp5((boundingbox_X.max()-boundingbox_X.min())/4*3+boundingbox_X.min(),
+ (boundingbox_Y.max()-boundingbox_Y.min())/4*0+boundingbox_Y.min());
+
+ Geom::Point gp6((boundingbox_X.max()-boundingbox_X.min())/4*1+boundingbox_X.min(),
+ (boundingbox_Y.max()-boundingbox_Y.min())/4*4+boundingbox_Y.min());
+
+ Geom::Point gp7((boundingbox_X.max()-boundingbox_X.min())/4*3+boundingbox_X.min(),
+ (boundingbox_Y.max()-boundingbox_Y.min())/4*4+boundingbox_Y.min());
+
+ Geom::Point gp8x9((boundingbox_X.max()-boundingbox_X.min())/4*2+boundingbox_X.min(),
+ (boundingbox_Y.max()-boundingbox_Y.min())/4*0+boundingbox_Y.min());
+
+ Geom::Point gp10x11((boundingbox_X.max()-boundingbox_X.min())/4*2+boundingbox_X.min(),
+ (boundingbox_Y.max()-boundingbox_Y.min())/4*4+boundingbox_Y.min());
+
+ Geom::Point gp12((boundingbox_X.max()-boundingbox_X.min())/4*0+boundingbox_X.min(),
+ (boundingbox_Y.max()-boundingbox_Y.min())/4*1+boundingbox_Y.min());
+
+ Geom::Point gp13((boundingbox_X.max()-boundingbox_X.min())/4*4+boundingbox_X.min(),
+ (boundingbox_Y.max()-boundingbox_Y.min())/4*1+boundingbox_Y.min());
+
+ Geom::Point gp14((boundingbox_X.max()-boundingbox_X.min())/4*0+boundingbox_X.min(),
+ (boundingbox_Y.max()-boundingbox_Y.min())/4*3+boundingbox_Y.min());
+
+ Geom::Point gp15((boundingbox_X.max()-boundingbox_X.min())/4*4+boundingbox_X.min(),
+ (boundingbox_Y.max()-boundingbox_Y.min())/4*3+boundingbox_Y.min());
+
+ Geom::Point gp16((boundingbox_X.max()-boundingbox_X.min())/4*1+boundingbox_X.min(),
+ (boundingbox_Y.max()-boundingbox_Y.min())/4*1+boundingbox_Y.min());
+
+ Geom::Point gp17((boundingbox_X.max()-boundingbox_X.min())/4*3+boundingbox_X.min(),
+ (boundingbox_Y.max()-boundingbox_Y.min())/4*1+boundingbox_Y.min());
+
+ Geom::Point gp18((boundingbox_X.max()-boundingbox_X.min())/4*1+boundingbox_X.min(),
+ (boundingbox_Y.max()-boundingbox_Y.min())/4*3+boundingbox_Y.min());
+
+ Geom::Point gp19((boundingbox_X.max()-boundingbox_X.min())/4*3+boundingbox_X.min(),
+ (boundingbox_Y.max()-boundingbox_Y.min())/4*3+boundingbox_Y.min());
+
+ Geom::Point gp20x21((boundingbox_X.max()-boundingbox_X.min())/4*2+boundingbox_X.min(),
+ (boundingbox_Y.max()-boundingbox_Y.min())/4*1+boundingbox_Y.min());
+
+ Geom::Point gp22x23((boundingbox_X.max()-boundingbox_X.min())/4*2+boundingbox_X.min(),
+ (boundingbox_Y.max()-boundingbox_Y.min())/4*3+boundingbox_Y.min());
+
+ Geom::Point gp24x26((boundingbox_X.max()-boundingbox_X.min())/4*0+boundingbox_X.min(),
+ (boundingbox_Y.max()-boundingbox_Y.min())/4*2+boundingbox_Y.min());
+
+ Geom::Point gp25x27((boundingbox_X.max()-boundingbox_X.min())/4*4+boundingbox_X.min(),
+ (boundingbox_Y.max()-boundingbox_Y.min())/4*2+boundingbox_Y.min());
+
+ Geom::Point gp28x30((boundingbox_X.max()-boundingbox_X.min())/4*1+boundingbox_X.min(),
+ (boundingbox_Y.max()-boundingbox_Y.min())/4*2+boundingbox_Y.min());
+
+ Geom::Point gp29x31((boundingbox_X.max()-boundingbox_X.min())/4*3+boundingbox_X.min(),
+ (boundingbox_Y.max()-boundingbox_Y.min())/4*2+boundingbox_Y.min());
+
+ Geom::Point gp32x33x34x35((boundingbox_X.max()-boundingbox_X.min())/4*2+boundingbox_X.min(),
+ (boundingbox_Y.max()-boundingbox_Y.min())/4*2+boundingbox_Y.min());
+
+ grid_point0.param_update_default(gp0);
+ grid_point1.param_update_default(gp1);
+ grid_point2.param_update_default(gp2);
+ grid_point3.param_update_default(gp3);
+ grid_point4.param_update_default(gp4);
+ grid_point5.param_update_default(gp5);
+ grid_point6.param_update_default(gp6);
+ grid_point7.param_update_default(gp7);
+ grid_point8x9.param_update_default(gp8x9);
+ grid_point10x11.param_update_default(gp10x11);
+ grid_point12.param_update_default(gp12);
+ grid_point13.param_update_default(gp13);
+ grid_point14.param_update_default(gp14);
+ grid_point15.param_update_default(gp15);
+ grid_point16.param_update_default(gp16);
+ grid_point17.param_update_default(gp17);
+ grid_point18.param_update_default(gp18);
+ grid_point19.param_update_default(gp19);
+ grid_point20x21.param_update_default(gp20x21);
+ grid_point22x23.param_update_default(gp22x23);
+ grid_point24x26.param_update_default(gp24x26);
+ grid_point25x27.param_update_default(gp25x27);
+ grid_point28x30.param_update_default(gp28x30);
+ grid_point29x31.param_update_default(gp29x31);
+ grid_point32x33x34x35.param_update_default(gp32x33x34x35);
+}
+
+void
+LPELattice2::resetGrid()
+{
+ grid_point0.param_set_and_write_default();
+ grid_point1.param_set_and_write_default();
+ grid_point2.param_set_and_write_default();
+ grid_point3.param_set_and_write_default();
+ grid_point4.param_set_and_write_default();
+ grid_point5.param_set_and_write_default();
+ grid_point6.param_set_and_write_default();
+ grid_point7.param_set_and_write_default();
+ grid_point8x9.param_set_and_write_default();
+ grid_point10x11.param_set_and_write_default();
+ grid_point12.param_set_and_write_default();
+ grid_point13.param_set_and_write_default();
+ grid_point14.param_set_and_write_default();
+ grid_point15.param_set_and_write_default();
+ grid_point16.param_set_and_write_default();
+ grid_point17.param_set_and_write_default();
+ grid_point18.param_set_and_write_default();
+ grid_point19.param_set_and_write_default();
+ grid_point20x21.param_set_and_write_default();
+ grid_point22x23.param_set_and_write_default();
+ grid_point24x26.param_set_and_write_default();
+ grid_point25x27.param_set_and_write_default();
+ grid_point28x30.param_set_and_write_default();
+ grid_point29x31.param_set_and_write_default();
+ grid_point32x33x34x35.param_set_and_write_default();
+ //todo:this hack is only to reposition the knots on reser grid button
+ //Better update path effect in LPEITEM
+ SPDesktop * desktop = inkscape_active_desktop();
+ tools_switch(desktop, TOOLS_SELECT);
+ tools_switch(desktop, TOOLS_NODES);
+}
+
+void
+LPELattice2::resetDefaults(SPItem const* item)
+{
+ Effect::resetDefaults(item);
+ original_bbox(SP_LPE_ITEM(item));
+ setDefaults();
+ resetGrid();
+}
+
+void
+LPELattice2::calculateCurve(Geom::Point a,Geom::Point b, SPCurve* c, bool horizontal, bool move)
+{
+ using Geom::X;
+ using Geom::Y;
+ if(move) c->moveto(a);
+ Geom::Point cubic1 = a + (1./3)* (b - a);
+ Geom::Point cubic2 = b + (1./3)* (a - b);
+ if(horizontal) c->curveto(Geom::Point(cubic1[X],a[Y]),Geom::Point(cubic2[X],b[Y]),b);
+ else c->curveto(Geom::Point(a[X],cubic1[Y]),Geom::Point(b[X],cubic2[Y]),b);
+}
+
+void
+LPELattice2::addCanvasIndicators(SPLPEItem const */*lpeitem*/, std::vector<Geom::PathVector> &hp_vec)
+{
+ hp_vec.clear();
+
+ SPCurve *c = new SPCurve();
+ calculateCurve(grid_point0,grid_point4, c,true, true);
+ calculateCurve(grid_point4,grid_point8x9, c,true, false);
+ calculateCurve(grid_point8x9,grid_point5, c,true, false);
+ calculateCurve(grid_point5,grid_point1, c,true, false);
+
+ calculateCurve(grid_point12,grid_point16, c,true, true);
+ calculateCurve(grid_point16,grid_point20x21, c,true, false);
+ calculateCurve(grid_point20x21,grid_point17, c,true, false);
+ calculateCurve(grid_point17,grid_point13, c,true, false);
+
+ calculateCurve(grid_point24x26,grid_point28x30, c,true, true);
+ calculateCurve(grid_point28x30,grid_point32x33x34x35, c,true, false);
+ calculateCurve(grid_point32x33x34x35,grid_point29x31, c,true, false);
+ calculateCurve(grid_point29x31,grid_point25x27, c,true, false);
+
+ calculateCurve(grid_point14,grid_point18, c,true, true);
+ calculateCurve(grid_point18,grid_point22x23, c,true, false);
+ calculateCurve(grid_point22x23,grid_point19, c,true, false);
+ calculateCurve(grid_point19,grid_point15, c,true, false);
+
+ calculateCurve(grid_point2,grid_point6, c,true, true);
+ calculateCurve(grid_point6,grid_point10x11, c,true, false);
+ calculateCurve(grid_point10x11,grid_point7, c,true, false);
+ calculateCurve(grid_point7,grid_point3, c,true, false);
+
+ calculateCurve(grid_point0,grid_point12, c,false, true);
+ calculateCurve(grid_point12,grid_point24x26, c,false, false);
+ calculateCurve(grid_point24x26,grid_point14, c,false, false);
+ calculateCurve(grid_point14,grid_point2, c,false, false);
+
+ calculateCurve(grid_point4,grid_point16, c,false, true);
+ calculateCurve(grid_point16,grid_point28x30, c,false, false);
+ calculateCurve(grid_point28x30,grid_point18, c,false, false);
+ calculateCurve(grid_point18,grid_point6, c,false, false);
+
+ calculateCurve(grid_point8x9,grid_point20x21, c,false, true);
+ calculateCurve(grid_point20x21,grid_point32x33x34x35, c,false, false);
+ calculateCurve(grid_point32x33x34x35,grid_point22x23, c,false, false);
+ calculateCurve(grid_point22x23,grid_point10x11, c,false, false);
+
+ calculateCurve(grid_point5,grid_point17, c, false, true);
+ calculateCurve(grid_point17,grid_point29x31, c,false, false);
+ calculateCurve(grid_point29x31,grid_point19, c,false, false);
+ calculateCurve(grid_point19,grid_point7, c,false, false);
+
+ calculateCurve(grid_point1,grid_point13, c, false, true);
+ calculateCurve(grid_point13,grid_point25x27, c,false, false);
+ calculateCurve(grid_point25x27,grid_point15, c,false, false);
+ calculateCurve(grid_point15,grid_point3, c, false, false);
+ hp_vec.push_back(c->get_pathvector());
+}
+
+
+/* ######################## */
+
+} //namespace LivePathEffect
+} /* namespace Inkscape */
+
+
+
+
+/*
+ Local Variables:
+ mode:c++
+ c-file-style:"stroustrup"
+ c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
+ indent-tabs-mode:nil
+ fill-column:99
+ End:
+*/
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4 :
diff --git a/src/live_effects/lpe-lattice2.h b/src/live_effects/lpe-lattice2.h
new file mode 100644
index 000000000..461f835c6
--- /dev/null
+++ b/src/live_effects/lpe-lattice2.h
@@ -0,0 +1,92 @@
+#ifndef INKSCAPE_LPE_LATTICE2_H
+#define INKSCAPE_LPE_LATTICE2_H
+
+/** \file
+ * LPE <lattice2> implementation, see lpe-lattice2.cpp.
+ */
+
+/*
+ * Authors:
+ * Johan Engelen
+ * Steren Giannini
+ * Noé Falzon
+ * Victor Navez
+ * ~suv
+ * Jabiertxo Arraiza
+*
+* Copyright (C) Johan Engelen 2007 <j.b.c.engelen@utwente.nl>
+ *
+ * Released under GNU GPL, read the file 'COPYING' for more information
+ */
+
+#include "live_effects/parameter/enum.h"
+#include "live_effects/effect.h"
+#include "live_effects/parameter/pointreseteable.h"
+#include "live_effects/lpegroupbbox.h"
+
+namespace Inkscape {
+namespace LivePathEffect {
+
+class LPELattice2 : public Effect, GroupBBoxEffect {
+public:
+
+ LPELattice2(LivePathEffectObject *lpeobject);
+ virtual ~LPELattice2();
+
+ virtual Geom::Piecewise<Geom::D2<Geom::SBasis> > doEffect_pwd2 (Geom::Piecewise<Geom::D2<Geom::SBasis> > const & pwd2_in);
+
+ virtual void resetDefaults(SPItem const* item);
+
+ virtual void doBeforeEffect(SPLPEItem const* lpeitem);
+
+ virtual Gtk::Widget * newWidget();
+
+ virtual void calculateCurve(Geom::Point a,Geom::Point b, SPCurve *c, bool horizontal, bool move);
+
+ virtual void setDefaults();
+
+ virtual void resetGrid();
+
+ //virtual void original_bbox(SPLPEItem const* lpeitem, bool absolute = false);
+
+ //virtual void addCanvasIndicators(SPLPEItem const*/*lpeitem*/, std::vector<Geom::PathVector> &/*hp_vec*/);
+
+ //virtual std::vector<Geom::PathVector> getHelperPaths(SPLPEItem const* lpeitem);
+protected:
+ void addCanvasIndicators(SPLPEItem const */*lpeitem*/, std::vector<Geom::PathVector> &hp_vec);
+private:
+
+ PointReseteableParam grid_point0;
+ PointReseteableParam grid_point1;
+ PointReseteableParam grid_point2;
+ PointReseteableParam grid_point3;
+ PointReseteableParam grid_point4;
+ PointReseteableParam grid_point5;
+ PointReseteableParam grid_point6;
+ PointReseteableParam grid_point7;
+ PointReseteableParam grid_point8x9;
+ PointReseteableParam grid_point10x11;
+ PointReseteableParam grid_point12;
+ PointReseteableParam grid_point13;
+ PointReseteableParam grid_point14;
+ PointReseteableParam grid_point15;
+ PointReseteableParam grid_point16;
+ PointReseteableParam grid_point17;
+ PointReseteableParam grid_point18;
+ PointReseteableParam grid_point19;
+ PointReseteableParam grid_point20x21;
+ PointReseteableParam grid_point22x23;
+ PointReseteableParam grid_point24x26;
+ PointReseteableParam grid_point25x27;
+ PointReseteableParam grid_point28x30;
+ PointReseteableParam grid_point29x31;
+ PointReseteableParam grid_point32x33x34x35;
+
+ LPELattice2(const LPELattice2&);
+ LPELattice2& operator=(const LPELattice2&);
+};
+
+} //namespace LivePathEffect
+} //namespace Inkscape
+
+#endif
diff --git a/src/live_effects/lpe-mirror_symmetry.cpp b/src/live_effects/lpe-mirror_symmetry.cpp
index 4d4837d8d..0bb67a4a2 100644
--- a/src/live_effects/lpe-mirror_symmetry.cpp
+++ b/src/live_effects/lpe-mirror_symmetry.cpp
@@ -43,6 +43,14 @@ LPEMirrorSymmetry::~LPEMirrorSymmetry()
}
void
+LPEMirrorSymmetry::doBeforeEffect (SPLPEItem const* lpeitem)
+{
+ SPLPEItem * item = const_cast<SPLPEItem*>(lpeitem);
+ item->apply_to_clippath(item);
+ item->apply_to_mask(item);
+}
+
+void
LPEMirrorSymmetry::doOnApply (SPLPEItem const* lpeitem)
{
using namespace Geom;
diff --git a/src/live_effects/lpe-mirror_symmetry.h b/src/live_effects/lpe-mirror_symmetry.h
index c01d1bf6f..a4a2b86c0 100644
--- a/src/live_effects/lpe-mirror_symmetry.h
+++ b/src/live_effects/lpe-mirror_symmetry.h
@@ -30,6 +30,8 @@ public:
virtual void doOnApply (SPLPEItem const* lpeitem);
+ virtual void doBeforeEffect (SPLPEItem const* lpeitem);
+
virtual std::vector<Geom::Path> doEffect_path (std::vector<Geom::Path> const & path_in);
private:
diff --git a/src/live_effects/lpe-offset.cpp b/src/live_effects/lpe-offset.cpp
index 192bd17ca..dc91775b7 100644
--- a/src/live_effects/lpe-offset.cpp
+++ b/src/live_effects/lpe-offset.cpp
@@ -55,6 +55,14 @@ static void append_half_circle(Geom::Piecewise<Geom::D2<Geom::SBasis> > &pwd2,
pwd2.continuousConcat(cap_pwd2);
}
+void
+LPEOffset::doBeforeEffect (SPLPEItem const* lpeitem)
+{
+ SPLPEItem * item = const_cast<SPLPEItem*>(lpeitem);
+ item->apply_to_clippath(item);
+ item->apply_to_mask(item);
+}
+
Geom::Piecewise<Geom::D2<Geom::SBasis> >
LPEOffset::doEffect_pwd2 (Geom::Piecewise<Geom::D2<Geom::SBasis> > const & pwd2_in)
{
diff --git a/src/live_effects/lpe-offset.h b/src/live_effects/lpe-offset.h
index 9966fd45d..997311c7d 100644
--- a/src/live_effects/lpe-offset.h
+++ b/src/live_effects/lpe-offset.h
@@ -28,6 +28,8 @@ public:
virtual void doOnApply (SPLPEItem const* lpeitem);
+ virtual void doBeforeEffect (SPLPEItem const* lpeitem);
+
virtual Geom::Piecewise<Geom::D2<Geom::SBasis> > doEffect_pwd2 (Geom::Piecewise<Geom::D2<Geom::SBasis> > const & pwd2_in);
private:
diff --git a/src/live_effects/lpe-perspective-envelope.cpp b/src/live_effects/lpe-perspective-envelope.cpp
new file mode 100644
index 000000000..4d8c79198
--- /dev/null
+++ b/src/live_effects/lpe-perspective-envelope.cpp
@@ -0,0 +1,387 @@
+/** \file
+ * LPE <perspective-envelope> implementation
+
+ */
+/*
+ * Authors:
+ * Jabiertxof Code migration from python extensions envelope and perspective
+ * Aaron Spike, aaron@ekips.org from envelope and perspective phyton code
+ * Dmitry Platonov, shadowjack@mail.ru, 2006 perspective approach & math
+ * Jose Hevia (freon) Transform algorithm from envelope
+ *
+ * Copyright (C) 2007-2014 Authors
+ *
+ * Released under GNU GPL, read the file 'COPYING' for more information
+ */
+
+#include <gtkmm.h>
+#include "live_effects/lpe-perspective-envelope.h"
+#include "helper/geom.h"
+#include "display/curve.h"
+#include "svg/svg.h"
+#include "ui/tools-switch.h"
+#include <gsl/gsl_linalg.h>
+#include "desktop.h"
+
+using namespace Geom;
+
+namespace Inkscape {
+namespace LivePathEffect {
+
+enum DeformationType {
+ DEFORMATION_PERSPECTIVE,
+ DEFORMATION_ENVELOPE
+};
+
+static const Util::EnumData<unsigned> DeformationTypeData[] = {
+ {DEFORMATION_PERSPECTIVE , N_("Perspective"), "Perspective"},
+ {DEFORMATION_ENVELOPE , N_("Envelope deformation"), "Envelope deformation"}
+};
+
+static const Util::EnumDataConverter<unsigned> DeformationTypeConverter(DeformationTypeData, sizeof(DeformationTypeData)/sizeof(*DeformationTypeData));
+
+LPEPerspectiveEnvelope::LPEPerspectiveEnvelope(LivePathEffectObject *lpeobject) :
+ Effect(lpeobject),
+ // initialise your parameters here:
+ deform_type(_("Type"), _("Select the type of deformation"), "deform_type", DeformationTypeConverter, &wr, this, DEFORMATION_PERSPECTIVE),
+ Up_Left_Point(_("Top Left"), _("Top Left - Ctrl+Alt+Click to reset"), "Up_Left_Point", &wr, this),
+ Up_Right_Point(_("Top Right"), _("Top Right - Ctrl+Alt+Click to reset"), "Up_Right_Point", &wr, this),
+ Down_Left_Point(_("Down Left"), _("Down Left - Ctrl+Alt+Click to reset"), "Down_Left_Point", &wr, this),
+ Down_Right_Point(_("Down Right"), _("Down Right - Ctrl+Alt+Click to reset"), "Down_Right_Point", &wr, this)
+{
+ // register all your parameters here, so Inkscape knows which parameters this effect has:
+ registerParameter( dynamic_cast<Parameter *>(&deform_type));
+ registerParameter( dynamic_cast<Parameter *>(&Up_Left_Point) );
+ registerParameter( dynamic_cast<Parameter *>(&Up_Right_Point) );
+ registerParameter( dynamic_cast<Parameter *>(&Down_Left_Point) );
+ registerParameter( dynamic_cast<Parameter *>(&Down_Right_Point) );
+}
+
+LPEPerspectiveEnvelope::~LPEPerspectiveEnvelope()
+{
+}
+
+void LPEPerspectiveEnvelope::doEffect(SPCurve *curve) {
+ using Geom::X;
+ using Geom::Y;
+ double projmatrix[3][3];
+ if(deform_type == DEFORMATION_PERSPECTIVE){
+ std::vector<Geom::Point> handles(4);
+ handles[0] = Down_Left_Point;
+ handles[1] = Up_Left_Point;
+ handles[2] = Up_Right_Point;
+ handles[3] = Down_Right_Point;
+ std::vector<Geom::Point> sourceHandles(4);
+ sourceHandles[0] = Geom::Point(boundingbox_X.min(), boundingbox_Y.max());
+ sourceHandles[1] = Geom::Point(boundingbox_X.min(), boundingbox_Y.min());
+ sourceHandles[2] = Geom::Point(boundingbox_X.max(), boundingbox_Y.min());
+ sourceHandles[3] = Geom::Point(boundingbox_X.max(), boundingbox_Y.max());
+ double solmatrix[8][8] = {{0}};
+ double free_term[8] = {0};
+ double gslSolmatrix[64];
+ for(unsigned int i = 0; i < 4; ++i){
+ solmatrix[i][0] = sourceHandles[i][X];
+ solmatrix[i][1] = sourceHandles[i][Y];
+ solmatrix[i][2] = 1;
+ solmatrix[i][6] = -handles[i][X] * sourceHandles[i][X];
+ solmatrix[i][7] = -handles[i][X] * sourceHandles[i][Y];
+ solmatrix[i+4][3] = sourceHandles[i][X];
+ solmatrix[i+4][4] = sourceHandles[i][Y];
+ solmatrix[i+4][5] = 1;
+ solmatrix[i+4][6] = -handles[i][Y] * sourceHandles[i][X];
+ solmatrix[i+4][7] = -handles[i][Y] * sourceHandles[i][Y];
+ free_term[i] = handles[i][X];
+ free_term[i+4] = handles[i][Y];
+ }
+ int h = 0;
+ for( int i = 0; i < 8; i++ ) {
+ for( int j = 0; j < 8; j++ ) {
+ gslSolmatrix[h] = solmatrix[i][j];
+ h++;
+ }
+ }
+ //this is get by this page:
+ //http://www.gnu.org/software/gsl/manual/html_node/Linear-Algebra-Examples.html#Linear-Algebra-Examples
+ gsl_matrix_view m = gsl_matrix_view_array (gslSolmatrix, 8, 8);
+ gsl_vector_view b = gsl_vector_view_array (free_term, 8);
+ gsl_vector *x = gsl_vector_alloc (8);
+ int s;
+ gsl_permutation * p = gsl_permutation_alloc (8);
+ gsl_linalg_LU_decomp (&m.matrix, p, &s);
+ gsl_linalg_LU_solve (&m.matrix, p, &b.vector, x);
+ h = 0;
+ for( int i = 0; i < 3; i++ ) {
+ for( int j = 0; j < 3; j++ ) {
+ if(h==8){
+ projmatrix[2][2] = 1.0;
+ continue;
+ }
+ projmatrix[i][j] = gsl_vector_get(x, h);
+ h++;
+ }
+ }
+ gsl_permutation_free (p);
+ gsl_vector_free (x);
+ }
+ Geom::PathVector const original_pathv = pathv_to_linear_and_cubic_beziers(curve->get_pathvector());
+ curve->reset();
+ Geom::CubicBezier const *cubic = NULL;
+ Geom::Point pointAt1(0, 0);
+ Geom::Point pointAt2(0, 0);
+ Geom::Point pointAt3(0, 0);
+ for (Geom::PathVector::const_iterator path_it = original_pathv.begin(); path_it != original_pathv.end(); ++path_it) {
+ //Si está vacío...
+ if (path_it->empty())
+ continue;
+ //Itreadores
+ SPCurve *nCurve = new SPCurve();
+ Geom::Path::const_iterator curve_it1 = path_it->begin();
+ Geom::Path::const_iterator curve_it2 = ++(path_it->begin());
+ Geom::Path::const_iterator curve_endit = path_it->end_default();
+
+ if (path_it->closed()) {
+ const Geom::Curve &closingline =
+ path_it->back_closed();
+ if (are_near(closingline.initialPoint(), closingline.finalPoint())) {
+ curve_endit = path_it->end_open();
+ }
+ }
+ if(deform_type == DEFORMATION_PERSPECTIVE){
+ nCurve->moveto(project_point(curve_it1->initialPoint(),projmatrix));
+ }else{
+ nCurve->moveto(project_point(curve_it1->initialPoint()));
+ }
+ while (curve_it1 != curve_endit) {
+ cubic = dynamic_cast<Geom::CubicBezier const *>(&*curve_it1);
+ if (cubic) {
+ pointAt1 = (*cubic)[1];
+ pointAt2 = (*cubic)[2];
+ } else {
+ pointAt1 = curve_it1->initialPoint();
+ pointAt2 = curve_it1->finalPoint();
+ }
+ pointAt3 = curve_it1->finalPoint();
+ if(deform_type == DEFORMATION_PERSPECTIVE){
+ pointAt1 = project_point(pointAt1,projmatrix);
+ pointAt2 = project_point(pointAt2,projmatrix);
+ pointAt3 = project_point(pointAt3,projmatrix);
+ }else{
+ pointAt1 = project_point(pointAt1);
+ pointAt2 = project_point(pointAt2);
+ pointAt3 = project_point(pointAt3);
+ }
+ nCurve->curveto(pointAt1, pointAt2, pointAt3);
+ ++curve_it1;
+ if(curve_it2 != curve_endit) {
+ ++curve_it2;
+ }
+ }
+ //y cerramos la curva
+ if (path_it->closed()) {
+ nCurve->move_endpoints(pointAt3, pointAt3);
+ nCurve->closepath_current();
+ }
+ curve->append(nCurve, false);
+ nCurve->reset();
+ delete nCurve;
+ }
+}
+
+Geom::Point
+LPEPerspectiveEnvelope::project_point(Geom::Point p){
+ double width = boundingbox_X.extent();
+ double height = boundingbox_Y.extent();
+ double delta_x = boundingbox_X.min() - p[X];
+ double delta_y = boundingbox_Y.max() - p[Y];
+ Geom::Coord xratio = (delta_x * sgn(delta_x)) / width;
+ Geom::Coord yratio = (delta_y * sgn(delta_y)) / height;
+ Geom::Line* horiz = new Geom::Line();
+ Geom::Line* vert = new Geom::Line();
+ vert->setPoints (pointAtRatio(yratio,Down_Left_Point,Up_Left_Point),pointAtRatio(yratio,Down_Right_Point,Up_Right_Point));
+ horiz->setPoints (pointAtRatio(xratio,Down_Left_Point,Down_Right_Point),pointAtRatio(xratio,Up_Left_Point,Up_Right_Point));
+
+ OptCrossing crossPoint = intersection(*horiz,*vert);
+ if(crossPoint){
+ return horiz->pointAt(Geom::Coord(crossPoint->ta));
+ }else{
+ return p;
+ }
+}
+
+Geom::Point
+LPEPerspectiveEnvelope::project_point(Geom::Point p, double m[][3]){
+ Geom::Coord x = p[0];
+ Geom::Coord y = p[1];
+ return Geom::Point(
+ Geom::Coord((x*m[0][0] + y*m[0][1] + m[0][2])/(x*m[2][0]+y*m[2][1]+m[2][2])),
+ Geom::Coord((x*m[1][0] + y*m[1][1] + m[1][2])/(x*m[2][0]+y*m[2][1]+m[2][2])));
+}
+
+Geom::Point
+LPEPerspectiveEnvelope::pointAtRatio(Geom::Coord ratio,Geom::Point A, Geom::Point B){
+ Geom::Coord x = A[X] + (ratio * (B[X]-A[X]));
+ Geom::Coord y = A[Y]+ (ratio * (B[Y]-A[Y]));
+ return Point(x, y);
+}
+
+
+Gtk::Widget *
+LPEPerspectiveEnvelope::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(6);
+ std::vector<Parameter *>::iterator it = param_vector.begin();
+ Gtk::HBox * hboxUpHandles = Gtk::manage(new Gtk::HBox(false,0));
+ Gtk::HBox * hboxDownHandles = Gtk::manage(new Gtk::HBox(false,0));
+ while (it != param_vector.end()) {
+ if ((*it)->widget_is_visible) {
+ Parameter * param = *it;
+ Gtk::Widget * widg = dynamic_cast<Gtk::Widget *>(param->param_newWidget());
+ if (param->param_key == "Up_Left_Point" ||
+ param->param_key == "Up_Right_Point" ||
+ param->param_key == "Down_Left_Point" ||
+ param->param_key == "Down_Right_Point")
+ {
+ Gtk::HBox * pointParameter = dynamic_cast<Gtk::HBox *>(widg);
+ std::vector< Gtk::Widget* > childList = pointParameter->get_children();
+ Gtk::HBox * pointParameterHBox = dynamic_cast<Gtk::HBox *>(childList[0]);
+ std::vector< Gtk::Widget* > childList2 = pointParameterHBox->get_children();
+ pointParameterHBox->remove(childList2[0][0]);
+ Glib::ustring * tip = param->param_getTooltip();
+ if (widg) {
+ if(param->param_key == "Up_Left_Point"){
+ Gtk::Label* handles = Gtk::manage(new Gtk::Label(Glib::ustring(_("Handles:")),Gtk::ALIGN_START));
+ vbox->pack_start(*handles, false, false, 2);
+ hboxUpHandles->pack_start(*widg, true, true, 2);
+ hboxUpHandles->pack_start(*Gtk::manage(new Gtk::VSeparator()), Gtk::PACK_EXPAND_WIDGET);
+ }else if(param->param_key == "Up_Right_Point"){
+ hboxUpHandles->pack_start(*widg, true, true, 2);
+ }else if(param->param_key == "Down_Left_Point"){
+ hboxDownHandles->pack_start(*widg, true, true, 2);
+ hboxDownHandles->pack_start(*Gtk::manage(new Gtk::VSeparator()), Gtk::PACK_EXPAND_WIDGET);
+ }else{
+ hboxDownHandles->pack_start(*widg, true, true, 2);
+ }
+ if (tip) {
+ widg->set_tooltip_text(*tip);
+ } else {
+ widg->set_tooltip_text("");
+ widg->set_has_tooltip(false);
+ }
+ }
+ }else{
+ Glib::ustring * tip = param->param_getTooltip();
+ if (widg) {
+ 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;
+ }
+ vbox->pack_start(*hboxUpHandles,true, true, 2);
+ Gtk::HBox * hboxMiddle = Gtk::manage(new Gtk::HBox(true,2));
+ hboxMiddle->pack_start(*Gtk::manage(new Gtk::HSeparator()), Gtk::PACK_EXPAND_WIDGET);
+ hboxMiddle->pack_start(*Gtk::manage(new Gtk::HSeparator()), Gtk::PACK_EXPAND_WIDGET);
+ vbox->pack_start(*hboxMiddle, false, true, 2);
+ vbox->pack_start(*hboxDownHandles, true, true, 2);
+ Gtk::HBox * hbox = Gtk::manage(new Gtk::HBox(false,0));
+ Gtk::Button* resetButton = Gtk::manage(new Gtk::Button(Gtk::Stock::CLEAR));
+ resetButton->signal_clicked().connect(sigc::mem_fun (*this,&LPEPerspectiveEnvelope::resetGrid));
+ resetButton->set_size_request(140,45);
+ vbox->pack_start(*hbox, true,true,2);
+ hbox->pack_start(*resetButton, false, false,2);
+ return dynamic_cast<Gtk::Widget *>(vbox);
+}
+
+void
+LPEPerspectiveEnvelope::doBeforeEffect (SPLPEItem const* lpeitem)
+{
+ original_bbox(lpeitem);
+ SPLPEItem * item = const_cast<SPLPEItem*>(lpeitem);
+ item->apply_to_clippath(item);
+ item->apply_to_mask(item);
+ setDefaults();
+}
+
+void
+LPEPerspectiveEnvelope::setDefaults()
+{
+ Geom::Point Up_Left(boundingbox_X.min(), boundingbox_Y.min());
+ Geom::Point Up_Right(boundingbox_X.max(), boundingbox_Y.min());
+ Geom::Point Down_Left(boundingbox_X.min(), boundingbox_Y.max());
+ Geom::Point Down_Right(boundingbox_X.max(), boundingbox_Y.max());
+
+ Up_Left_Point.param_update_default(Up_Left);
+ Up_Right_Point.param_update_default(Up_Right);
+ Down_Right_Point.param_update_default(Down_Right);
+ Down_Left_Point.param_update_default(Down_Left);
+}
+
+void
+LPEPerspectiveEnvelope::resetGrid()
+{
+ Up_Left_Point.param_set_and_write_default();
+ Up_Right_Point.param_set_and_write_default();
+ Down_Right_Point.param_set_and_write_default();
+ Down_Left_Point.param_set_and_write_default();
+ //todo:this hack is only to reposition the knots on reser grid button
+ //Better update path effect in LPEITEM
+ SPDesktop * desktop = inkscape_active_desktop();
+ tools_switch(desktop, TOOLS_SELECT);
+ tools_switch(desktop, TOOLS_NODES);
+}
+
+void
+LPEPerspectiveEnvelope::resetDefaults(SPItem const* item)
+{
+ Effect::resetDefaults(item);
+ original_bbox(SP_LPE_ITEM(item));
+ setDefaults();
+ resetGrid();
+}
+
+void
+LPEPerspectiveEnvelope::addCanvasIndicators(SPLPEItem const */*lpeitem*/, std::vector<Geom::PathVector> &hp_vec)
+{
+ hp_vec.clear();
+
+ SPCurve *c = new SPCurve();
+ c->reset();
+ c->moveto(Up_Left_Point);
+ c->lineto(Up_Right_Point);
+ c->lineto(Down_Right_Point);
+ c->lineto(Down_Left_Point);
+ c->lineto(Up_Left_Point);
+ hp_vec.push_back(c->get_pathvector());
+}
+
+
+/* ######################## */
+
+} //namespace LivePathEffect
+} /* namespace Inkscape */
+
+
+
+
+/*
+ Local Variables:
+ mode:c++
+ c-file-style:"stroustrup"
+ c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
+ indent-tabs-mode:nil
+ fill-column:99
+ End:
+*/
+// vim: file_type=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4 :
diff --git a/src/live_effects/lpe-perspective-envelope.h b/src/live_effects/lpe-perspective-envelope.h
new file mode 100644
index 000000000..2f253882e
--- /dev/null
+++ b/src/live_effects/lpe-perspective-envelope.h
@@ -0,0 +1,70 @@
+#ifndef INKSCAPE_LPE_PERSPECTIVE_ENVELOPE_H
+#define INKSCAPE_LPE_PERSPECTIVE_ENVELOPE_H
+
+/** \file
+ * LPE <perspective-envelope> implementation , see lpe-perspective-envelope.cpp.
+
+ */
+/*
+ * Authors:
+ * Jabiertxof Code migration from python extensions envelope and perspective
+ * Aaron Spike, aaron@ekips.org from envelope and perspective phyton code
+ * Dmitry Platonov, shadowjack@mail.ru, 2006 perspective approach & math
+ * Jose Hevia (freon) Transform algorithm from envelope
+ *
+ * Copyright (C) 2007-2014 Authors
+ *
+ * Released under GNU GPL, read the file 'COPYING' for more information
+ */
+
+#include "live_effects/parameter/enum.h"
+#include "live_effects/effect.h"
+#include "live_effects/parameter/pointreseteable.h"
+#include "live_effects/lpegroupbbox.h"
+
+namespace Inkscape {
+namespace LivePathEffect {
+
+class LPEPerspectiveEnvelope : public Effect, GroupBBoxEffect {
+public:
+
+ LPEPerspectiveEnvelope(LivePathEffectObject *lpeobject);
+
+ virtual ~LPEPerspectiveEnvelope();
+
+ virtual void doEffect(SPCurve *curve);
+
+ virtual Geom::Point project_point(Geom::Point p);
+
+ virtual Geom::Point project_point(Geom::Point p, double m[][3]);
+
+ virtual Geom::Point pointAtRatio(Geom::Coord ratio,Geom::Point A, Geom::Point B);
+
+ virtual void resetDefaults(SPItem const* item);
+
+ virtual void doBeforeEffect(SPLPEItem const* lpeitem);
+
+ virtual Gtk::Widget * newWidget();
+
+ virtual void setDefaults();
+
+ virtual void resetGrid();
+
+protected:
+ void addCanvasIndicators(SPLPEItem const */*lpeitem*/, std::vector<Geom::PathVector> &hp_vec);
+private:
+
+ EnumParam<unsigned> deform_type;
+ PointReseteableParam Up_Left_Point;
+ PointReseteableParam Up_Right_Point;
+ PointReseteableParam Down_Left_Point;
+ PointReseteableParam Down_Right_Point;
+
+ LPEPerspectiveEnvelope(const LPEPerspectiveEnvelope&);
+ LPEPerspectiveEnvelope& operator=(const LPEPerspectiveEnvelope&);
+};
+
+} //namespace LivePathEffect
+} //namespace Inkscape
+
+#endif
diff --git a/src/live_effects/lpe-perspective_path.cpp b/src/live_effects/lpe-perspective_path.cpp
index a2372131c..d43772cf7 100644
--- a/src/live_effects/lpe-perspective_path.cpp
+++ b/src/live_effects/lpe-perspective_path.cpp
@@ -18,6 +18,7 @@
#include "document.h"
#include "document-private.h"
#include "live_effects/lpe-perspective_path.h"
+#include "live_effects/lpeobject.h"
#include "sp-item-group.h"
#include "knot-holder-entity.h"
#include "knotholder.h"
@@ -62,7 +63,7 @@ LPEPerspectivePath::LPEPerspectivePath(LivePathEffectObject *lpeobject) :
concatenate_before_pwd2 = true; // don't split the path into its subpaths
_provides_knotholder_entities = true;
unapply = false;
- Persp3D *persp = persp3d_document_first_persp(inkscape_active_document());
+ Persp3D *persp = persp3d_document_first_persp(lpeobject->document);
if(persp == 0 ){
char *msg = _("You need a BOX 3D object");
Gtk::MessageDialog dialog(msg, false, Gtk::MESSAGE_INFO,
@@ -72,7 +73,7 @@ LPEPerspectivePath::LPEPerspectivePath(LivePathEffectObject *lpeobject) :
return;
}
Proj::TransfMat3x4 pmat = persp->perspective_impl->tmat;
- pmat = pmat * inkscape_active_desktop()->doc2dt();
+ pmat = pmat * SP_ACTIVE_DESKTOP->doc2dt();
pmat.copy_tmat(tmat);
}
@@ -89,13 +90,16 @@ LPEPerspectivePath::doBeforeEffect (SPLPEItem const* lpeitem)
SP_LPE_ITEM(lpeitem)->removeCurrentPathEffect(false);
return;
}
+ SPLPEItem * item = const_cast<SPLPEItem*>(lpeitem);
+ item->apply_to_clippath(item);
+ item->apply_to_mask(item);
}
void LPEPerspectivePath::refresh(Gtk::Entry* perspective) {
perspectiveID = perspective->get_text();
Persp3D *first = 0;
Persp3D *persp = 0;
- for ( SPObject *child = inkscape_active_document()->getDefs()->firstChild(); child && !persp; child = child->getNext() ) {
+ for ( SPObject *child = this->lpeobj->document->getDefs()->firstChild(); child && !persp; child = child->getNext() ) {
if (SP_IS_PERSP3D(child) && first == 0) {
first = SP_PERSP3D(child);
}
@@ -125,7 +129,7 @@ void LPEPerspectivePath::refresh(Gtk::Entry* perspective) {
dialog.run();
}
Proj::TransfMat3x4 pmat = persp->perspective_impl->tmat;
- pmat = pmat * inkscape_active_desktop()->doc2dt();
+ pmat = pmat * SP_ACTIVE_DESKTOP->doc2dt();
pmat.copy_tmat(tmat);
};
@@ -144,7 +148,7 @@ LPEPerspectivePath::doEffect_pwd2 (Geom::Piecewise<Geom::D2<Geom::SBasis> > cons
Piecewise<SBasis> preimage[4];
//Geom::Point orig = Geom::Point(bounds_X.min(), bounds_Y.middle());
- //orig = Geom::Point(orig[X], sp_document_height(inkscape_active_document()) - orig[Y]);
+ //orig = Geom::Point(orig[X], sp_document_height(this->lpeobj->document) - orig[Y]);
//double offset = uses_plane_xy ? boundingbox_X.extent() : 0.0;
diff --git a/src/live_effects/lpe-powerstroke-interpolators.h b/src/live_effects/lpe-powerstroke-interpolators.h
index ee4951882..e3ab37e27 100644
--- a/src/live_effects/lpe-powerstroke-interpolators.h
+++ b/src/live_effects/lpe-powerstroke-interpolators.h
@@ -28,6 +28,7 @@ enum InterpolatorType {
INTERP_CUBICBEZIER,
INTERP_CUBICBEZIER_JOHAN,
INTERP_SPIRO,
+ INTERP_CUBICBEZIER_SMOOTH,
INTERP_CENTRIPETAL_CATMULLROM
};
@@ -134,6 +135,43 @@ private:
CubicBezierJohan& operator=(const CubicBezierJohan&);
};
+/// @todo invent name for this class
+class CubicBezierSmooth : public Interpolator {
+public:
+ CubicBezierSmooth(double beta = 0.2) {
+ _beta = beta;
+ };
+ virtual ~CubicBezierSmooth() {};
+
+ virtual Path interpolateToPath(std::vector<Point> const &points) const {
+ Path fit;
+ fit.start(points.at(0));
+ unsigned int num_points = points.size();
+ for (unsigned int i = 1; i < num_points; ++i) {
+ Point p0 = points.at(i-1);
+ Point p1 = points.at(i);
+ Point dx = Point(p1[X] - p0[X], 0);
+ if (i == 1) {
+ fit.appendNew<CubicBezier>(p0, p1-0.75*dx, p1);
+ } else if (i == points.size() - 1) {
+ fit.appendNew<CubicBezier>(p0+0.75*dx, p1, p1);
+ } else {
+ fit.appendNew<CubicBezier>(p0+_beta*dx, p1-_beta*dx, p1);
+ }
+ }
+ return fit;
+ };
+
+ void setBeta(double beta) {
+ _beta = beta;
+ }
+
+ double _beta;
+
+private:
+ CubicBezierSmooth(const CubicBezierSmooth&);
+ CubicBezierSmooth& operator=(const CubicBezierSmooth&);
+};
class SpiroInterpolator : public Interpolator {
public:
@@ -168,8 +206,8 @@ private:
SpiroInterpolator& operator=(const SpiroInterpolator&);
};
+// Quick mockup for testing the behavior for powerstroke controlpoint interpolation
class CentripetalCatmullRomInterpolator : public Interpolator {
-// the code in this class can certainly be optimized and made more terse, feel free
public:
CentripetalCatmullRomInterpolator() {};
virtual ~CentripetalCatmullRomInterpolator() {};
@@ -179,12 +217,7 @@ public:
Geom::Path fit(points.front());
- if (n_points < 2) return fit;
- if (n_points < 3) {
- // if only 2 points, return linear segment
- fit.appendNew<Geom::LineSegment>(points[1]);
- return fit;
- }
+ if (n_points < 3) return fit; // TODO special cases for 0,1 and 2 input points
// return n_points-1 cubic segments
@@ -198,7 +231,6 @@ public:
Point p3 = (i < n_points-3) ? points[i+3] : points[i+2];
fit.append(calc_bezier(p0, p1, p2, p3));
- // this is quite wasteful: the distances between the same points are repeatedly calculated by calc_bezier
}
return fit;
@@ -254,7 +286,8 @@ private:
CentripetalCatmullRomInterpolator& operator=(const CentripetalCatmullRomInterpolator&);
};
-Interpolator*
+
+inline Interpolator*
Interpolator::create(InterpolatorType type) {
switch (type) {
case INTERP_LINEAR:
@@ -265,6 +298,8 @@ Interpolator::create(InterpolatorType type) {
return new Geom::Interpolate::CubicBezierJohan();
case INTERP_SPIRO:
return new Geom::Interpolate::SpiroInterpolator();
+ case INTERP_CUBICBEZIER_SMOOTH:
+ return new Geom::Interpolate::CubicBezierSmooth();
case INTERP_CENTRIPETAL_CATMULLROM:
return new Geom::Interpolate::CentripetalCatmullRomInterpolator();
default:
diff --git a/src/live_effects/lpe-powerstroke.cpp b/src/live_effects/lpe-powerstroke.cpp
index 087424c21..03a10807a 100644
--- a/src/live_effects/lpe-powerstroke.cpp
+++ b/src/live_effects/lpe-powerstroke.cpp
@@ -15,6 +15,11 @@
#include "sp-shape.h"
#include "style.h"
+#include "xml/repr.h"
+#include "sp-paint-server.h"
+#include "svg/svg-color.h"
+#include "desktop-style.h"
+#include "svg/css-ostringstream.h"
#include "display/curve.h"
#include <2geom/path.h>
@@ -185,11 +190,12 @@ namespace Inkscape {
namespace LivePathEffect {
static const Util::EnumData<unsigned> InterpolatorTypeData[] = {
+ {Geom::Interpolate::INTERP_CUBICBEZIER_SMOOTH, N_("CubicBezierSmooth"), "CubicBezierSmooth"},
{Geom::Interpolate::INTERP_LINEAR , N_("Linear"), "Linear"},
{Geom::Interpolate::INTERP_CUBICBEZIER , N_("CubicBezierFit"), "CubicBezierFit"},
{Geom::Interpolate::INTERP_CUBICBEZIER_JOHAN , N_("CubicBezierJohan"), "CubicBezierJohan"},
{Geom::Interpolate::INTERP_SPIRO , N_("SpiroInterpolator"), "SpiroInterpolator"},
- {Geom::Interpolate::INTERP_CENTRIPETAL_CATMULLROM , N_("Centripetal Catmull-Rom"), "CentripetalCatmullRom"}
+ {Geom::Interpolate::INTERP_CENTRIPETAL_CATMULLROM, N_("Centripetal Catmull-Rom"), "CentripetalCatmullRom"}
};
static const Util::EnumDataConverter<unsigned> InterpolatorTypeConverter(InterpolatorTypeData, sizeof(InterpolatorTypeData)/sizeof(*InterpolatorTypeData));
@@ -231,12 +237,12 @@ LPEPowerStroke::LPEPowerStroke(LivePathEffectObject *lpeobject) :
Effect(lpeobject),
offset_points(_("Offset points"), _("Offset points"), "offset_points", &wr, this),
sort_points(_("Sort points"), _("Sort offset points according to their time value along the curve"), "sort_points", &wr, this, true),
- interpolator_type(_("Interpolator type:"), _("Determines which kind of interpolator will be used to interpolate between stroke width along the path"), "interpolator_type", InterpolatorTypeConverter, &wr, this, Geom::Interpolate::INTERP_CUBICBEZIER_JOHAN),
+ interpolator_type(_("Interpolator type:"), _("Determines which kind of interpolator will be used to interpolate between stroke width along the path"), "interpolator_type", InterpolatorTypeConverter, &wr, this, Geom::Interpolate::INTERP_CUBICBEZIER),
interpolator_beta(_("Smoothness:"), _("Sets the smoothness for the CubicBezierJohan interpolator; 0 = linear interpolation, 1 = smooth"), "interpolator_beta", &wr, this, 0.2),
- start_linecap_type(_("Start cap:"), _("Determines the shape of the path's start"), "start_linecap_type", LineCapTypeConverter, &wr, this, LINECAP_ROUND),
- linejoin_type(_("Join:"), _("Determines the shape of the path's corners"), "linejoin_type", LineJoinTypeConverter, &wr, this, LINEJOIN_ROUND),
+ start_linecap_type(_("Start cap:"), _("Determines the shape of the path's start"), "start_linecap_type", LineCapTypeConverter, &wr, this, LINECAP_BUTT),
+ linejoin_type(_("Join:"), _("Determines the shape of the path's corners"), "linejoin_type", LineJoinTypeConverter, &wr, this, LINEJOIN_EXTRP_MITER_ARC),
miter_limit(_("Miter limit:"), _("Maximum length of the miter (in units of stroke width)"), "miter_limit", &wr, this, 4.),
- end_linecap_type(_("End cap:"), _("Determines the shape of the path's end"), "end_linecap_type", LineCapTypeConverter, &wr, this, LINECAP_ROUND)
+ end_linecap_type(_("End cap:"), _("Determines the shape of the path's end"), "end_linecap_type", LineCapTypeConverter, &wr, this, LINECAP_BUTT)
{
show_orig_path = true;
@@ -265,20 +271,52 @@ void
LPEPowerStroke::doOnApply(SPLPEItem const* lpeitem)
{
if (SP_IS_SHAPE(lpeitem)) {
+ SPLPEItem* item = const_cast<SPLPEItem*>(lpeitem);
std::vector<Geom::Point> points;
Geom::PathVector const &pathv = SP_SHAPE(lpeitem)->_curve->get_pathvector();
- double width = (lpeitem && lpeitem->style) ? lpeitem->style->stroke_width.computed : 1.;
+ double width = (lpeitem && lpeitem->style) ? lpeitem->style->stroke_width.computed / 2 : 1.;
+
+ SPCSSAttr *css = sp_repr_css_attr_new ();
+ if (true) {
+ if (lpeitem->style->stroke.isPaintserver()) {
+ SPPaintServer * server = lpeitem->style->getStrokePaintServer();
+ if (server) {
+ Glib::ustring str;
+ str += "url(#";
+ str += server->getId();
+ str += ")";
+ sp_repr_css_set_property (css, "fill", str.c_str());
+ }
+ } else if (lpeitem->style->stroke.isColor()) {
+ gchar c[64];
+ sp_svg_write_color (c, sizeof(c), lpeitem->style->stroke.value.color.toRGBA32(SP_SCALE24_TO_FLOAT(lpeitem->style->stroke_opacity.value)));
+ sp_repr_css_set_property (css, "fill", c);
+ } else {
+ sp_repr_css_set_property (css, "fill", "none");
+ }
+ } else {
+ sp_repr_css_unset_property (css, "fill");
+ }
+
+ sp_repr_css_set_property(css, "stroke", "none");
+
+ sp_desktop_apply_css_recursive(item, css, true);
+ sp_repr_css_attr_unref (css);
+
+ item->updateRepr();
if (pathv.empty()) {
- points.push_back( Geom::Point(0.,width) );
+ points.push_back( Geom::Point(0.2,width) );
points.push_back( Geom::Point(0.5,width) );
- points.push_back( Geom::Point(1.,width) );
+ points.push_back( Geom::Point(0.8,width) );
} else {
Geom::Path const &path = pathv.front();
Geom::Path::size_type const size = path.size_default();
- points.push_back( Geom::Point(0.,width) );
+ if (!path.closed()) {
+ points.push_back( Geom::Point(0.2,width) );
+ }
points.push_back( Geom::Point(0.5*size,width) );
if (!path.closed()) {
- points.push_back( Geom::Point(size,width) );
+ points.push_back( Geom::Point(size - 0.2,width) );
}
}
offset_points.param_set_and_write_new_value(points);
@@ -287,6 +325,45 @@ LPEPowerStroke::doOnApply(SPLPEItem const* lpeitem)
}
}
+void LPEPowerStroke::doOnRemove(SPLPEItem const* lpeitem)
+{
+ if (SP_IS_SHAPE(lpeitem)) {
+ SPLPEItem *item = const_cast<SPLPEItem*>(lpeitem);
+ SPCSSAttr *css = sp_repr_css_attr_new ();
+ if (true) {
+ if (lpeitem->style->fill.isPaintserver()) {
+ SPPaintServer * server = lpeitem->style->getFillPaintServer();
+ if (server) {
+ Glib::ustring str;
+ str += "url(#";
+ str += server->getId();
+ str += ")";
+ sp_repr_css_set_property (css, "stroke", str.c_str());
+ }
+ } else if (lpeitem->style->fill.isColor()) {
+ gchar c[64];
+ sp_svg_write_color (c, sizeof(c), lpeitem->style->stroke.value.color.toRGBA32(SP_SCALE24_TO_FLOAT(lpeitem->style->stroke_opacity.value)));
+ sp_repr_css_set_property (css, "stroke", c);
+ } else {
+ sp_repr_css_set_property (css, "stroke", "none");
+ }
+ } else {
+ sp_repr_css_unset_property (css, "stroke");
+ }
+
+ Inkscape::CSSOStringStream os;
+ os << offset_points.median_width() * 2;
+ sp_repr_css_set_property (css, "stroke-width", os.str().c_str());
+
+ sp_repr_css_set_property(css, "fill", "none");
+
+ sp_desktop_apply_css_recursive(item, css, true);
+ sp_repr_css_attr_unref (css);
+
+ item->updateRepr();
+ }
+}
+
void
LPEPowerStroke::adjustForNewPath(std::vector<Geom::Path> const & path_in)
{
@@ -596,6 +673,9 @@ LPEPowerStroke::doEffect_path (std::vector<Geom::Path> const & path_in)
if (Geom::Interpolate::CubicBezierJohan *johan = dynamic_cast<Geom::Interpolate::CubicBezierJohan*>(interpolator)) {
johan->setBeta(interpolator_beta);
}
+ if (Geom::Interpolate::CubicBezierSmooth *smooth = dynamic_cast<Geom::Interpolate::CubicBezierSmooth*>(interpolator)) {
+ smooth->setBeta(interpolator_beta);
+ }
Geom::Path strokepath = interpolator->interpolateToPath(ts);
delete interpolator;
diff --git a/src/live_effects/lpe-powerstroke.h b/src/live_effects/lpe-powerstroke.h
index 7bc736820..a773434aa 100644
--- a/src/live_effects/lpe-powerstroke.h
+++ b/src/live_effects/lpe-powerstroke.h
@@ -25,9 +25,11 @@ public:
LPEPowerStroke(LivePathEffectObject *lpeobject);
virtual ~LPEPowerStroke();
+
virtual std::vector<Geom::Path> doEffect_path (std::vector<Geom::Path> const & path_in);
virtual void doOnApply(SPLPEItem const* lpeitem);
+ virtual void doOnRemove(SPLPEItem const* lpeitem);
// methods called by path-manipulator upon edits
void adjustForNewPath(std::vector<Geom::Path> const & path_in);
diff --git a/src/live_effects/lpe-roughen.cpp b/src/live_effects/lpe-roughen.cpp
new file mode 100644
index 000000000..ffd5433bf
--- /dev/null
+++ b/src/live_effects/lpe-roughen.cpp
@@ -0,0 +1,339 @@
+/**
+ * @file
+ * Roughen LPE implementation. Creates roughen paths.
+ */
+/* Authors:
+ * Jabier Arraiza Cenoz <jabier.arraiza@marker.es>
+ *
+ * Thanks to all people involved specialy to Josh Andler for the idea and to the
+ * original extensions authors.
+ *
+ * Copyright (C) 2014 Authors
+ *
+ * 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 "live_effects/parameter/parameter.h"
+#include "helper/geom.h"
+#include <glibmm/i18n.h>
+#include <cmath>
+
+namespace Inkscape {
+namespace LivePathEffect {
+
+static const Util::EnumData<DivisionMethod> DivisionMethodData[DM_END] = {
+ { DM_SEGMENTS, N_("By number of segments"), "segments" },
+ { DM_SIZE, N_("By max. segment size"), "size" }
+};
+static const Util::EnumDataConverter<DivisionMethod>
+DMConverter(DivisionMethodData, DM_END);
+
+LPERoughen::LPERoughen(LivePathEffectObject *lpeobject)
+ : Effect(lpeobject),
+ // initialise your parameters here:
+ unit(_("Unit"), _("Unit"), "unit", &wr, this),
+ method(_("Method"), _("Division method"), "method", DMConverter, &wr,
+ this, DM_SEGMENTS),
+ maxSegmentSize(_("Max. segment size"), _("Max. segment size"),
+ "maxSegmentSize", &wr, this, 10.),
+ segments(_("Number of segments"), _("Number of segments"), "segments",
+ &wr, this, 2),
+ displaceX(_("Max. displacement in X"), _("Max. displacement in X"),
+ "displaceX", &wr, this, 10.),
+ displaceY(_("Max. displacement in Y"), _("Max. displacement in Y"),
+ "displaceY", &wr, this, 10.),
+ shiftNodes(_("Shift nodes"), _("Shift nodes"), "shiftNodes", &wr, this,
+ true),
+ shiftNodeHandles(_("Shift node handles"), _("Shift node handles"),
+ "shiftNodeHandles", &wr, this, true)
+{
+ registerParameter(&unit);
+ registerParameter(&method);
+ registerParameter(&maxSegmentSize);
+ registerParameter(&segments);
+ registerParameter(&displaceX);
+ registerParameter(&displaceY);
+ registerParameter(&shiftNodes);
+ registerParameter(&shiftNodeHandles);
+ displaceX.param_set_range(0., Geom::infinity());
+ displaceY.param_set_range(0., Geom::infinity());
+ maxSegmentSize.param_set_range(0., Geom::infinity());
+ maxSegmentSize.param_set_increments(1, 1);
+ maxSegmentSize.param_set_digits(1);
+ segments.param_set_range(1, Geom::infinity());
+ segments.param_set_increments(1, 1);
+ segments.param_set_digits(0);
+}
+
+LPERoughen::~LPERoughen() {}
+
+void LPERoughen::doBeforeEffect(SPLPEItem const *lpeitem)
+{
+ displaceX.resetRandomizer();
+ displaceY.resetRandomizer();
+ srand(1);
+ SPLPEItem * item = const_cast<SPLPEItem*>(lpeitem);
+ item->apply_to_clippath(item);
+ item->apply_to_mask(item);
+}
+
+Gtk::Widget *LPERoughen::newWidget()
+{
+ 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());
+ if (param->param_key == "unit") {
+ Gtk::Label *unitLabel = Gtk::manage(new Gtk::Label(
+ Glib::ustring(_("<b>Roughen unit</b>")), Gtk::ALIGN_START));
+ unitLabel->set_use_markup(true);
+ vbox->pack_start(*unitLabel, false, false, 2);
+ vbox->pack_start(*Gtk::manage(new Gtk::HSeparator()),
+ Gtk::PACK_EXPAND_WIDGET);
+ }
+ if (param->param_key == "method") {
+ Gtk::Label *methodLabel = Gtk::manage(new Gtk::Label(
+ Glib::ustring(_("<b>Add nodes</b> Subdivide each segment")),
+ Gtk::ALIGN_START));
+ methodLabel->set_use_markup(true);
+ vbox->pack_start(*methodLabel, false, false, 2);
+ vbox->pack_start(*Gtk::manage(new Gtk::HSeparator()),
+ Gtk::PACK_EXPAND_WIDGET);
+ }
+ if (param->param_key == "displaceX") {
+ Gtk::Label *displaceXLabel = Gtk::manage(new Gtk::Label(
+ Glib::ustring(_("<b>Jitter nodes</b> Move nodes/handles")),
+ Gtk::ALIGN_START));
+ displaceXLabel->set_use_markup(true);
+ vbox->pack_start(*displaceXLabel, false, false, 2);
+ vbox->pack_start(*Gtk::manage(new Gtk::HSeparator()),
+ Gtk::PACK_EXPAND_WIDGET);
+ }
+ Glib::ustring *tip = param->param_getTooltip();
+ if (widg) {
+ 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);
+}
+
+double LPERoughen::sign(double randNumber)
+{
+ if (rand() % 100 < 49) {
+ randNumber *= -1.;
+ }
+ return randNumber;
+}
+
+Geom::Point LPERoughen::randomize()
+{
+ double displaceXParsed = Inkscape::Util::Quantity::convert(
+ displaceX, unit.get_abbreviation(), "px");
+ double displaceYParsed = Inkscape::Util::Quantity::convert(
+ displaceY, unit.get_abbreviation(), "px");
+
+ Geom::Point output = Geom::Point(sign(displaceXParsed), sign(displaceYParsed));
+ return output;
+}
+
+void LPERoughen::doEffect(SPCurve *curve)
+{
+ Geom::PathVector const original_pathv =
+ pathv_to_linear_and_cubic_beziers(curve->get_pathvector());
+ curve->reset();
+ for (Geom::PathVector::const_iterator path_it = original_pathv.begin();
+ path_it != original_pathv.end(); ++path_it) {
+ if (path_it->empty())
+ continue;
+
+ Geom::Path::const_iterator curve_it1 = path_it->begin();
+ Geom::Path::const_iterator curve_it2 = ++(path_it->begin());
+ Geom::Path::const_iterator curve_endit = path_it->end_default();
+ SPCurve *nCurve = new SPCurve();
+ if (path_it->closed()) {
+ const Geom::Curve &closingline =
+ path_it->back_closed();
+ if (are_near(closingline.initialPoint(), closingline.finalPoint())) {
+ curve_endit = path_it->end_open();
+ }
+ }
+ Geom::Point initialMove(0, 0);
+ if (shiftNodes) {
+ initialMove = randomize();
+ }
+ Geom::Point initialPoint = curve_it1->initialPoint() + initialMove;
+ nCurve->moveto(initialPoint);
+ Geom::Point A0(0, 0);
+ Geom::Point A1(0, 0);
+ Geom::Point A2(0, 0);
+ Geom::Point A3(0, 0);
+ while (curve_it1 != curve_endit) {
+ Geom::CubicBezier const *cubic = NULL;
+ A0 = curve_it1->initialPoint();
+ A1 = curve_it1->initialPoint();
+ A2 = curve_it1->finalPoint();
+ A3 = curve_it1->finalPoint();
+ cubic = dynamic_cast<Geom::CubicBezier const *>(&*curve_it1);
+ if (cubic) {
+ A1 = (*cubic)[1];
+ if (shiftNodes) {
+ A1 = (*cubic)[1] + initialMove;
+ }
+ A2 = (*cubic)[2];
+ nCurve->curveto(A1, A2, A3);
+ } else {
+ nCurve->lineto(A3);
+ }
+ double length = Inkscape::Util::Quantity::convert(
+ curve_it1->length(0.001), "px", unit.get_abbreviation());
+ std::size_t splits = 0;
+ if (method == DM_SEGMENTS) {
+ splits = segments;
+ } else {
+ splits = ceil(length / maxSegmentSize);
+ }
+ for (unsigned int t = splits; t >= 1; t--) {
+ if (t == 1 && splits != 1) {
+ continue;
+ }
+ const SPCurve *tmp;
+ if (splits == 1) {
+ tmp = jitter(nCurve->last_segment());
+ } else {
+ tmp = addNodesAndJitter(nCurve->last_segment(), 1. / t);
+ }
+ if (nCurve->get_segment_count() > 1) {
+ nCurve->backspace();
+ nCurve->append_continuous(tmp, 0.001);
+ } else {
+ nCurve = tmp->copy();
+ }
+ delete tmp;
+ }
+ ++curve_it1;
+ if(curve_it2 != curve_endit) {
+ ++curve_it2;
+ }
+ }
+ if (path_it->closed()) {
+ nCurve->closepath_current();
+ }
+ curve->append(nCurve, false);
+ nCurve->reset();
+ delete nCurve;
+ }
+}
+
+SPCurve *LPERoughen::addNodesAndJitter(const Geom::Curve *A, double t)
+{
+ SPCurve *out = new SPCurve();
+ Geom::CubicBezier const *cubic = dynamic_cast<Geom::CubicBezier const *>(&*A);
+ Geom::Point A1(0, 0);
+ Geom::Point A2(0, 0);
+ Geom::Point A3(0, 0);
+ Geom::Point B1(0, 0);
+ Geom::Point B2(0, 0);
+ Geom::Point B3(0, 0);
+ if (shiftNodes) {
+ A3 = randomize();
+ B3 = randomize();
+ }
+ if (shiftNodeHandles) {
+ A1 = randomize();
+ A2 = randomize();
+ B1 = randomize();
+ B2 = randomize();
+ } else {
+ A2 = A3;
+ B1 = A3;
+ B2 = B3;
+ }
+ if (cubic) {
+ std::pair<Geom::CubicBezier, Geom::CubicBezier> div = cubic->subdivide(t);
+ std::vector<Geom::Point> seg1 = div.first.points(),
+ seg2 = div.second.points();
+ out->moveto(seg1[0]);
+ out->curveto(seg1[1] + A1, seg1[2] + A2, seg1[3] + A3);
+ out->curveto(seg2[1] + B1, seg2[2], seg2[3]);
+ } else if (shiftNodeHandles) {
+ out->moveto(A->initialPoint());
+ out->curveto(A->pointAt(t / 3) + A1, A->pointAt((t / 3) * 2) + A2,
+ A->pointAt(t) + A3);
+ out->curveto(A->pointAt(t + (t / 3)) + B1, A->pointAt(t + ((t / 3) * 2)),
+ A->finalPoint());
+ } else {
+ out->moveto(A->initialPoint());
+ out->lineto(A->pointAt(t) + A3);
+ out->lineto(A->finalPoint());
+ }
+ return out;
+}
+
+SPCurve *LPERoughen::jitter(const Geom::Curve *A)
+{
+ SPCurve *out = new SPCurve();
+ Geom::CubicBezier const *cubic = dynamic_cast<Geom::CubicBezier const *>(&*A);
+ Geom::Point A1(0, 0);
+ Geom::Point A2(0, 0);
+ Geom::Point A3(0, 0);
+ if (shiftNodes) {
+ A3 = randomize();
+ }
+ if (shiftNodeHandles) {
+ A1 = randomize();
+ A2 = randomize();
+ } else {
+ A2 = A3;
+ }
+ if (cubic) {
+ out->moveto((*cubic)[0]);
+ out->curveto((*cubic)[1] + A1, (*cubic)[2] + A2, (*cubic)[3] + A3);
+ } else if (shiftNodeHandles) {
+ out->moveto(A->initialPoint());
+ out->curveto(A->pointAt(0.3333) + A1, A->pointAt(0.6666) + A2,
+ A->finalPoint() + A3);
+ } else {
+ out->moveto(A->initialPoint());
+ out->lineto(A->finalPoint() + A3);
+ }
+ return out;
+}
+
+Geom::Point LPERoughen::tpoint(Geom::Point A, Geom::Point B, double t)
+{
+ using Geom::X;
+ using Geom::Y;
+ return Geom::Point(A[X] + t * (B[X] - A[X]), A[Y] + t * (B[Y] - A[Y]));
+}
+
+}; //namespace LivePathEffect
+}; /* namespace Inkscape */
+
+/*
+ Local Variables:
+ mode:c++
+ c-file-style:"stroustrup"
+ c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
+ indent-tabs-mode:nil
+ fill-column:99
+ End:
+*/
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4 :
diff --git a/src/live_effects/lpe-roughen.h b/src/live_effects/lpe-roughen.h
new file mode 100644
index 000000000..d5ec726bd
--- /dev/null
+++ b/src/live_effects/lpe-roughen.h
@@ -0,0 +1,63 @@
+/** @file
+ * @brief Roughen LPE effect, see lpe-roughen.cpp.
+ */
+/* Authors:
+ * Jabier Arraiza Cenoz <jabier.arraiza@marker.es>
+ *
+ * Copyright (C) 2014 Authors
+ *
+ * Released under GNU GPL, read the file 'COPYING' for more information
+ */
+
+#ifndef INKSCAPE_LPE_ROUGHEN_H
+#define INKSCAPE_LPE_ROUGHEN_H
+
+#include "live_effects/parameter/enum.h"
+#include "live_effects/effect.h"
+#include "live_effects/parameter/parameter.h"
+#include "live_effects/parameter/path.h"
+#include "live_effects/parameter/bool.h"
+#include "live_effects/parameter/unit.h"
+#include "live_effects/parameter/random.h"
+
+namespace Inkscape {
+namespace LivePathEffect {
+
+enum DivisionMethod {
+ DM_SEGMENTS,
+ DM_SIZE,
+ DM_END
+};
+
+class LPERoughen : public Effect {
+
+public:
+ LPERoughen(LivePathEffectObject *lpeobject);
+ virtual ~LPERoughen();
+
+ virtual void doEffect(SPCurve *curve);
+ virtual double sign(double randNumber);
+ virtual Geom::Point randomize();
+ virtual void doBeforeEffect(SPLPEItem const * lpeitem);
+ virtual SPCurve *addNodesAndJitter(const Geom::Curve *A, double t);
+ virtual SPCurve *jitter(const Geom::Curve *A);
+ virtual Geom::Point tpoint(Geom::Point A, Geom::Point B, double t = 0.5);
+ virtual Gtk::Widget *newWidget();
+
+private:
+ UnitParam unit;
+ EnumParam<DivisionMethod> method;
+ ScalarParam maxSegmentSize;
+ ScalarParam segments;
+ RandomParam displaceX;
+ RandomParam displaceY;
+ BoolParam shiftNodes;
+ BoolParam shiftNodeHandles;
+ LPERoughen(const LPERoughen &);
+ LPERoughen &operator=(const LPERoughen &);
+
+};
+
+}; //namespace LivePathEffect
+}; //namespace Inkscape
+#endif
diff --git a/src/live_effects/lpe-show_handles.cpp b/src/live_effects/lpe-show_handles.cpp
new file mode 100644
index 000000000..7b2b445b7
--- /dev/null
+++ b/src/live_effects/lpe-show_handles.cpp
@@ -0,0 +1,211 @@
+/*
+ * Authors:
+ * Jabier Arraiza Cenoz
+*
+* 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 <glibmm/i18n.h>
+#include "live_effects/lpe-show_handles.h"
+#include "live_effects/parameter/parameter.h"
+#include <2geom/sbasis-to-bezier.h>
+#include <2geom/svg-path-parser.h>
+#include "helper/geom.h"
+#include "desktop-style.h"
+#include "style.h"
+#include "svg/svg.h"
+
+namespace Inkscape {
+namespace LivePathEffect {
+
+LPEShowHandles::LPEShowHandles(LivePathEffectObject *lpeobject)
+ : Effect(lpeobject),
+ nodes(_("Show nodes"), _("Show nodes"), "nodes", &wr, this, true),
+ handles(_("Show handles"), _("Show handles"), "handles", &wr, this, true),
+ originalPath(_("Show path"), _("Show path"), "originalPath", &wr, this, true),
+ scaleNodesAndHandles(_("Scale nodes and handles"), _("Scale nodes and handles"), "scaleNodesAndHandles", &wr, this, 10)
+{
+ registerParameter(dynamic_cast<Parameter *>(&nodes));
+ registerParameter(dynamic_cast<Parameter *>(&handles));
+ registerParameter(dynamic_cast<Parameter *>(&originalPath));
+ registerParameter(dynamic_cast<Parameter *>(&scaleNodesAndHandles));
+ scaleNodesAndHandles.param_set_range(0, 500.);
+ scaleNodesAndHandles.param_set_increments(1, 1);
+ scaleNodesAndHandles.param_set_digits(2);
+ strokeWidth = 1.0;
+}
+
+bool LPEShowHandles::alertsOff = false;
+
+/**
+ * Sets default styles to element
+ * this permanently remove.some styles of the element
+ */
+
+void LPEShowHandles::doOnApply(SPLPEItem const* lpeitem)
+{
+ if(!alertsOff) {
+ char *msg = _("The \"show handles\" path effect will remove any custom style on the object you are applying it to. If this is not what you want, click Cancel.");
+ Gtk::MessageDialog dialog(msg, false, Gtk::MESSAGE_QUESTION, Gtk::BUTTONS_OK_CANCEL, true);
+ gint response = dialog.run();
+ alertsOff = true;
+ if(response == GTK_RESPONSE_CANCEL) {
+ SPLPEItem* item = const_cast<SPLPEItem*>(lpeitem);
+ item->removeCurrentPathEffect(false);
+ return;
+ }
+ }
+ SPLPEItem* item = const_cast<SPLPEItem*>(lpeitem);
+ SPCSSAttr *css = sp_repr_css_attr_new ();
+ sp_repr_css_set_property (css, "stroke", "black");
+ sp_repr_css_set_property (css, "stroke-width", "1");
+ sp_repr_css_set_property (css, "stroke-linecap", "butt");
+ sp_repr_css_set_property(css, "fill", "none");
+
+ sp_desktop_apply_css_recursive(item, css, true);
+ sp_repr_css_attr_unref (css);
+}
+
+void LPEShowHandles::doBeforeEffect (SPLPEItem const* lpeitem)
+{
+ SPItem const* item = SP_ITEM(lpeitem);
+ strokeWidth = item->style->stroke_width.computed;
+}
+
+std::vector<Geom::Path> LPEShowHandles::doEffect_path (std::vector<Geom::Path> const & path_in)
+{
+ std::vector<Geom::Path> path_out;
+ Geom::PathVector const original_pathv = pathv_to_linear_and_cubic_beziers(path_in);
+ if(originalPath) {
+ for (unsigned int i=0; i < path_in.size(); i++) {
+ path_out.push_back(path_in[i]);
+ }
+ }
+ if(!outlinepath.empty()) {
+ outlinepath.clear();
+ }
+ generateHelperPath(original_pathv);
+ for (unsigned int i=0; i < outlinepath.size(); i++) {
+ path_out.push_back(outlinepath[i]);
+ }
+ return path_out;
+}
+
+void
+LPEShowHandles::generateHelperPath(Geom::PathVector result)
+{
+ if(!handles && !nodes) {
+ return;
+ }
+
+ Geom::CubicBezier const *cubic = NULL;
+ for (Geom::PathVector::iterator path_it = result.begin(); path_it != result.end(); ++path_it) {
+ //Si está vacío...
+ if (path_it->empty()) {
+ continue;
+ }
+ //Itreadores
+ Geom::Path::const_iterator curve_it1 = path_it->begin(); // incoming curve
+ Geom::Path::const_iterator curve_it2 = ++(path_it->begin()); // outgoing curve
+ Geom::Path::const_iterator curve_endit = path_it->end_default(); // this determines when the loop has to stop
+
+ if (path_it->closed()) {
+ // if the path is closed, maybe we have to stop a bit earlier because the
+ // closing line segment has zerolength.
+ const Geom::Curve &closingline = path_it->back_closed(); // the closing line segment is always of type
+ // Geom::LineSegment.
+ if (are_near(closingline.initialPoint(), closingline.finalPoint())) {
+ // closingline.isDegenerate() did not work, because it only checks for
+ // *exact* zero length, which goes wrong for relative coordinates and
+ // rounding errors...
+ // the closing line segment has zero-length. So stop before that one!
+ curve_endit = path_it->end_open();
+ }
+ }
+ if(nodes) {
+ drawNode(curve_it1->initialPoint());
+ }
+ while (curve_it1 != curve_endit) {
+ cubic = dynamic_cast<Geom::CubicBezier const *>(&*curve_it1);
+ if (cubic) {
+ if(handles) {
+ if(!are_near((*cubic)[0],(*cubic)[1])){
+ drawHandle((*cubic)[1]);
+ drawHandleLine((*cubic)[0],(*cubic)[1]);
+ }
+ if(!are_near((*cubic)[3],(*cubic)[2])){
+ drawHandle((*cubic)[2]);
+ drawHandleLine((*cubic)[3],(*cubic)[2]);
+ }
+ }
+ }
+ if(nodes) {
+ drawNode(curve_it1->finalPoint());
+ }
+ ++curve_it1;
+ if(curve_it2 != curve_endit){
+ ++curve_it2;
+ }
+ }
+ }
+}
+
+void
+LPEShowHandles::drawNode(Geom::Point p)
+{
+ if(strokeWidth * scaleNodesAndHandles > 0.0) {
+ double diameter = strokeWidth * scaleNodesAndHandles;
+ char const * svgd;
+ svgd = "M 0.55,0.5 A 0.05,0.05 0 0 1 0.5,0.55 0.05,0.05 0 0 1 0.45,0.5 0.05,0.05 0 0 1 0.5,0.45 0.05,0.05 0 0 1 0.55,0.5 Z M 0,0 1,0 1,1 0,1 Z";
+ Geom::PathVector pathv = sp_svg_read_pathv(svgd);
+ pathv *= Geom::Affine(diameter,0,0,diameter,0,0);
+ pathv += p - Geom::Point(diameter/2,diameter/2);
+ outlinepath.push_back(pathv[0]);
+ outlinepath.push_back(pathv[1]);
+ }
+}
+
+void
+LPEShowHandles::drawHandle(Geom::Point p)
+{
+ if(strokeWidth * scaleNodesAndHandles > 0.0) {
+ double diameter = strokeWidth * scaleNodesAndHandles;
+ char const * svgd;
+ svgd = "M 0.7,0.35 A 0.35,0.35 0 0 1 0.35,0.7 0.35,0.35 0 0 1 0,0.35 0.35,0.35 0 0 1 0.35,0 0.35,0.35 0 0 1 0.7,0.35 Z";
+ Geom::PathVector pathv = sp_svg_read_pathv(svgd);
+ pathv *= Geom::Affine(diameter,0,0,diameter,0,0);
+ pathv += p - Geom::Point(diameter * 0.35,diameter * 0.35);
+ outlinepath.push_back(pathv[0]);
+ }
+}
+
+
+void
+LPEShowHandles::drawHandleLine(Geom::Point p,Geom::Point p2)
+{
+ Geom::Path path;
+ double diameter = strokeWidth * scaleNodesAndHandles;
+ if(diameter > 0.0 && Geom::distance(p,p2) > (diameter * 0.35)){
+ Geom::Ray ray2(p, p2);
+ p2 = p2 - Geom::Point::polar(ray2.angle(),(diameter * 0.35));
+ }
+ path.start( p );
+ path.appendNew<Geom::LineSegment>( p2 );
+ outlinepath.push_back(path);
+}
+
+}; //namespace LivePathEffect
+}; /* namespace Inkscape */
+
+/*
+ Local Variables:
+ mode:c++
+ c-file-style:"stroustrup"
+ c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
+ indent-tabs-mode:nil
+ fill-column:99
+ End:
+*/
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4 :
diff --git a/src/live_effects/lpe-show_handles.h b/src/live_effects/lpe-show_handles.h
new file mode 100644
index 000000000..278908bb5
--- /dev/null
+++ b/src/live_effects/lpe-show_handles.h
@@ -0,0 +1,61 @@
+#ifndef INKSCAPE_LPE_SHOW_HANDLES_H
+#define INKSCAPE_LPE_SHOW_HANDLES_H
+
+/*
+ * Authors:
+ * Jabier Arraiza Cenoz
+*
+* Copyright (C) Jabier Arraiza Cenoz 2014 <jabier.arraiza@marker.es>
+ * Released under GNU GPL, read the file 'COPYING' for more information
+ */
+
+#include "live_effects/effect.h"
+#include "live_effects/lpegroupbbox.h"
+#include "live_effects/parameter/bool.h"
+
+namespace Inkscape {
+namespace LivePathEffect {
+
+class LPEShowHandles : public Effect , GroupBBoxEffect {
+
+public:
+ LPEShowHandles(LivePathEffectObject *lpeobject);
+ virtual ~LPEShowHandles(){}
+
+ virtual void doOnApply(SPLPEItem const* lpeitem);
+
+ virtual void doBeforeEffect (SPLPEItem const* lpeitem);
+
+ virtual void generateHelperPath(Geom::PathVector result);
+
+ virtual void drawNode(Geom::Point p);
+
+ virtual void drawHandle(Geom::Point p);
+
+ virtual void drawHandleLine(Geom::Point p,Geom::Point p2);
+
+protected:
+
+ virtual std::vector<Geom::Path> doEffect_path (std::vector<Geom::Path> const & path_in);
+
+private:
+
+ BoolParam nodes;
+ BoolParam handles;
+ BoolParam originalPath;
+ ScalarParam scaleNodesAndHandles;
+ double strokeWidth;
+ static bool alertsOff;
+
+ Geom::PathVector outlinepath;
+
+ LPEShowHandles(const LPEShowHandles &);
+ LPEShowHandles &operator=(const LPEShowHandles &);
+
+};
+
+}; //namespace LivePathEffect
+}; //namespace Inkscape
+#endif
+
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4 :
diff --git a/src/live_effects/lpe-simplify.cpp b/src/live_effects/lpe-simplify.cpp
new file mode 100644
index 000000000..c191fbbe6
--- /dev/null
+++ b/src/live_effects/lpe-simplify.cpp
@@ -0,0 +1,292 @@
+/*
+ * 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 "live_effects/parameter/parameter.h"
+#include <glibmm/i18n.h>
+#include "helper/geom.h"
+#include "livarot/Path.h"
+#include "splivarot.h"
+#include <2geom/svg-path-parser.h>
+#include "desktop.h"
+#include "inkscape.h"
+#include "svg/svg.h"
+#include "ui/tools/node-tool.h"
+#include <2geom/d2.h>
+#include <2geom/generic-rect.h>
+#include <2geom/interval.h>
+#include "ui/icon-names.h"
+
+namespace Inkscape {
+namespace LivePathEffect {
+
+LPESimplify::LPESimplify(LivePathEffectObject *lpeobject)
+ : Effect(lpeobject),
+ steps(_("Steps:"),_("Change number of simplify steps "), "steps", &wr, this,1),
+ threshold(_("Roughly threshold:"), _("Roughly threshold:"), "threshold", &wr, this, 0.003),
+ helper_size(_("Helper size:"), _("Helper size"), "helper_size", &wr, this, 2.),
+ nodes(_("Helper nodes"), _("Show helper nodes"), "nodes", &wr, this, false,
+ "", INKSCAPE_ICON("on"), INKSCAPE_ICON("off")),
+ handles(_("Helper handles"), _("Show helper handles"), "handles", &wr, this, false,
+ "", INKSCAPE_ICON("on"), INKSCAPE_ICON("off")),
+ simplifyindividualpaths(_("Paths separately"), _("Simplifying paths (separately)"), "simplifyindividualpaths", &wr, this, false,
+ "", INKSCAPE_ICON("on"), INKSCAPE_ICON("off")),
+ simplifyJustCoalesce(_("Just coalesce"), _("Simplify just coalesce"), "simplifyJustCoalesce", &wr, this, false,
+ "", INKSCAPE_ICON("on"), INKSCAPE_ICON("off"))
+ {
+ registerParameter(dynamic_cast<Parameter *>(&steps));
+ registerParameter(dynamic_cast<Parameter *>(&threshold));
+ registerParameter(dynamic_cast<Parameter *>(&helper_size));
+ registerParameter(dynamic_cast<Parameter *>(&nodes));
+ registerParameter(dynamic_cast<Parameter *>(&handles));
+ registerParameter(dynamic_cast<Parameter *>(&simplifyindividualpaths));
+ registerParameter(dynamic_cast<Parameter *>(&simplifyJustCoalesce));
+ threshold.param_set_range(0.0001, Geom::infinity());
+ threshold.param_set_increments(0.0001, 0.0001);
+ threshold.param_set_digits(6);
+ steps.param_set_range(0, 100);
+ steps.param_set_increments(1, 1);
+ steps.param_set_digits(0);
+ helper_size.param_set_range(0.1, 100);
+ helper_size.param_set_increments(1, 1);
+ helper_size.param_set_digits(1);
+}
+
+LPESimplify::~LPESimplify() {}
+
+void
+LPESimplify::doBeforeEffect (SPLPEItem const* lpeitem)
+{
+ if(!hp.empty()){
+ hp.clear();
+ }
+ bbox = SP_ITEM(lpeitem)->visualBounds();
+ SPLPEItem * item = const_cast<SPLPEItem*>(lpeitem);
+ item->apply_to_clippath(item);
+ item->apply_to_mask(item);
+
+}
+
+Gtk::Widget *
+LPESimplify::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();
+ Gtk::HBox * buttons = Gtk::manage(new Gtk::HBox(true,0));
+ Gtk::HBox * buttonsTwo = Gtk::manage(new Gtk::HBox(true,0));
+ while (it != param_vector.end()) {
+ if ((*it)->widget_is_visible) {
+ Parameter * param = *it;
+ Gtk::Widget * widg = dynamic_cast<Gtk::Widget *>(param->param_newWidget());
+ if (param->param_key == "simplifyindividualpaths" ||
+ param->param_key == "simplifyJustCoalesce")
+ {
+ Glib::ustring * tip = param->param_getTooltip();
+ if (widg) {
+ buttonsTwo->pack_start(*widg, true, true, 2);
+ if (tip) {
+ widg->set_tooltip_text(*tip);
+ } else {
+ widg->set_tooltip_text("");
+ widg->set_has_tooltip(false);
+ }
+ }
+ } else if (param->param_key == "nodes" ||
+ param->param_key == "handles")
+ {
+ Glib::ustring * tip = param->param_getTooltip();
+ if (widg) {
+ buttons->pack_start(*widg, true, true, 2);
+ if (tip) {
+ widg->set_tooltip_text(*tip);
+ } else {
+ widg->set_tooltip_text("");
+ widg->set_has_tooltip(false);
+ }
+ }
+ }else{
+ Glib::ustring * tip = param->param_getTooltip();
+ if (widg) {
+ Gtk::HBox * scalarParameter = dynamic_cast<Gtk::HBox *>(widg);
+ std::vector< Gtk::Widget* > childList = scalarParameter->get_children();
+ Gtk::Entry* entryWidg = dynamic_cast<Gtk::Entry *>(childList[1]);
+ entryWidg->set_width_chars(8);
+ 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;
+ }
+ vbox->pack_start(*buttons,true, true, 2);
+ vbox->pack_start(*buttonsTwo,true, true, 2);
+ return dynamic_cast<Gtk::Widget *>(vbox);
+}
+
+void
+LPESimplify::doEffect(SPCurve *curve) {
+ Geom::PathVector const original_pathv = pathv_to_linear_and_cubic_beziers(curve->get_pathvector());
+ gdouble size = Geom::L2(bbox->dimensions());
+ //size /= Geom::Affine(0,0,0,0,0,0).descrim();
+ Path* pathliv = Path_for_pathvector(original_pathv);
+ if(simplifyindividualpaths){
+ size = Geom::L2(Geom::bounds_fast(original_pathv)->dimensions());
+ }
+ for (int unsigned i = 0; i < steps; i++){
+ if ( simplifyJustCoalesce ) {
+ pathliv->Coalesce(threshold * size);
+ }else{
+ pathliv->ConvertEvenLines(threshold * size);
+ pathliv->Simplify(threshold * size);
+ }
+ }
+ Geom::PathVector outres = Geom::parse_svg_path(pathliv->svg_dump_path());
+ generateHelperPath(outres);
+ curve->set_pathvector(outres);
+ if(SP_ACTIVE_DESKTOP && INK_IS_NODE_TOOL(SP_ACTIVE_DESKTOP->event_context)){
+ SPDesktop* desktop = SP_ACTIVE_DESKTOP;
+ Inkscape::UI::Tools::NodeTool *nt = static_cast<Inkscape::UI::Tools::NodeTool*>(desktop->event_context);
+ nt->update_helperpath();
+ }
+}
+
+void
+LPESimplify::generateHelperPath(Geom::PathVector result)
+{
+ if(!handles && !nodes){
+ return;
+ }
+
+ if(steps < 1){
+ return;
+ }
+
+ Geom::CubicBezier const *cubic = NULL;
+ for (Geom::PathVector::iterator path_it = result.begin(); path_it != result.end(); ++path_it) {
+ //Si está vacío...
+ if (path_it->empty()){
+ continue;
+ }
+ //Itreadores
+ Geom::Path::const_iterator curve_it1 = path_it->begin(); // incoming curve
+ Geom::Path::const_iterator curve_it2 =
+ ++(path_it->begin()); // outgoing curve
+ Geom::Path::const_iterator curve_endit =
+ path_it->end_default(); // this determines when the loop has to stop
+
+ if (path_it->closed()) {
+ // if the path is closed, maybe we have to stop a bit earlier because the
+ // closing line segment has zerolength.
+ const Geom::Curve &closingline =
+ path_it->back_closed(); // the closing line segment is always of type
+ // Geom::LineSegment.
+ if (are_near(closingline.initialPoint(), closingline.finalPoint())) {
+ // closingline.isDegenerate() did not work, because it only checks for
+ // *exact* zero length, which goes wrong for relative coordinates and
+ // rounding errors...
+ // the closing line segment has zero-length. So stop before that one!
+ curve_endit = path_it->end_open();
+ }
+ }
+ if(nodes){
+ drawNode(curve_it1->initialPoint());
+ }
+ while (curve_it1 != curve_endit) {
+ cubic = dynamic_cast<Geom::CubicBezier const *>(&*curve_it1);
+ if (cubic) {
+ if(handles) {
+ if(!are_near((*cubic)[0],(*cubic)[1])){
+ drawHandle((*cubic)[1]);
+ drawHandleLine((*cubic)[0],(*cubic)[1]);
+ }
+ if(!are_near((*cubic)[3],(*cubic)[2])){
+ drawHandle((*cubic)[2]);
+ drawHandleLine((*cubic)[3],(*cubic)[2]);
+ }
+ }
+ }
+ if(nodes) {
+ drawNode(curve_it1->finalPoint());
+ }
+ ++curve_it1;
+ if(curve_it2 != curve_endit){
+ ++curve_it2;
+ }
+ }
+ }
+}
+
+void
+LPESimplify::drawNode(Geom::Point p)
+{
+ double r = helper_size/0.67;
+ char const * svgd;
+ svgd = "M 0.55,0.5 A 0.05,0.05 0 0 1 0.5,0.55 0.05,0.05 0 0 1 0.45,0.5 0.05,0.05 0 0 1 0.5,0.45 0.05,0.05 0 0 1 0.55,0.5 Z M 0,0 1,0 1,1 0,1 Z";
+ Geom::PathVector pathv = sp_svg_read_pathv(svgd);
+ pathv *= Geom::Affine(r,0,0,r,0,0);
+ pathv += p - Geom::Point(0.5*r,0.5*r);
+ hp.push_back(pathv[0]);
+ hp.push_back(pathv[1]);
+}
+
+void
+LPESimplify::drawHandle(Geom::Point p)
+{
+ double r = helper_size/0.67;
+ char const * svgd;
+ svgd = "M 0.7,0.35 A 0.35,0.35 0 0 1 0.35,0.7 0.35,0.35 0 0 1 0,0.35 0.35,0.35 0 0 1 0.35,0 0.35,0.35 0 0 1 0.7,0.35 Z";
+ Geom::PathVector pathv = sp_svg_read_pathv(svgd);
+ pathv *= Geom::Affine(r,0,0,r,0,0);
+ pathv += p - Geom::Point(0.35*r,0.35*r);
+ hp.push_back(pathv[0]);
+}
+
+
+void
+LPESimplify::drawHandleLine(Geom::Point p,Geom::Point p2)
+{
+ Geom::Path path;
+ path.start( p );
+ double diameter = helper_size/0.67;
+ if(helper_size > 0.0 && Geom::distance(p,p2) > (diameter * 0.35)){
+ Geom::Ray ray2(p, p2);
+ p2 = p2 - Geom::Point::polar(ray2.angle(),(diameter * 0.35));
+ }
+ path.appendNew<Geom::LineSegment>( p2 );
+ hp.push_back(path);
+}
+
+void
+LPESimplify::addCanvasIndicators(SPLPEItem const */*lpeitem*/, std::vector<Geom::PathVector> &hp_vec)
+{
+ hp_vec.push_back(hp);
+}
+
+
+}; //namespace LivePathEffect
+}; /* namespace Inkscape */
+
+/*
+ Local Variables:
+ mode:c++
+ c-file-style:"stroustrup"
+ c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
+ indent-tabs-mode:nil
+ fill-column:99
+ End:
+*/
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4 :
diff --git a/src/live_effects/lpe-simplify.h b/src/live_effects/lpe-simplify.h
new file mode 100644
index 000000000..6acf2f2d4
--- /dev/null
+++ b/src/live_effects/lpe-simplify.h
@@ -0,0 +1,59 @@
+#ifndef INKSCAPE_LPE_SIMPLIFY_H
+#define INKSCAPE_LPE_SIMPLIFY_H
+
+/*
+ * Inkscape::LPESimplify
+ *
+ * Released under GNU GPL, read the file 'COPYING' for more information
+ */
+
+#include "live_effects/effect.h"
+#include "live_effects/parameter/togglebutton.h"
+#include "live_effects/lpegroupbbox.h"
+
+namespace Inkscape {
+namespace LivePathEffect {
+
+class LPESimplify : public Effect , GroupBBoxEffect{
+
+public:
+ LPESimplify(LivePathEffectObject *lpeobject);
+ virtual ~LPESimplify();
+
+ virtual void doEffect(SPCurve *curve);
+
+ virtual void doBeforeEffect (SPLPEItem const* lpeitem);
+
+ virtual void generateHelperPath(Geom::PathVector result);
+
+ virtual Gtk::Widget * newWidget();
+
+ virtual void drawNode(Geom::Point p);
+
+ virtual void drawHandle(Geom::Point p);
+
+ virtual void drawHandleLine(Geom::Point p,Geom::Point p2);
+
+protected:
+ void addCanvasIndicators(SPLPEItem const */*lpeitem*/, std::vector<Geom::PathVector> &hp_vec);
+
+private:
+ ScalarParam steps;
+ ScalarParam threshold;
+ ScalarParam helper_size;
+ ToggleButtonParam nodes;
+ ToggleButtonParam handles;
+ ToggleButtonParam simplifyindividualpaths;
+ ToggleButtonParam simplifyJustCoalesce;
+
+ Geom::PathVector hp;
+ Geom::OptRect bbox;
+
+ LPESimplify(const LPESimplify &);
+ LPESimplify &operator=(const LPESimplify &);
+
+};
+
+}; //namespace LivePathEffect
+}; //namespace Inkscape
+#endif
diff --git a/src/live_effects/lpe-tangent_to_curve.cpp b/src/live_effects/lpe-tangent_to_curve.cpp
index dbebdf7fb..bce4876af 100644
--- a/src/live_effects/lpe-tangent_to_curve.cpp
+++ b/src/live_effects/lpe-tangent_to_curve.cpp
@@ -16,8 +16,6 @@
#include <glibmm/i18n.h>
#include "live_effects/lpe-tangent_to_curve.h"
-// FIXME: The following are only needed to convert the path's SPCurve* to pwd2.
-// There must be a more convenient way to achieve this.
#include "sp-path.h"
#include "display/curve.h"
@@ -108,13 +106,13 @@ LPETangentToCurve::addKnotHolderEntities(KnotHolder *knotholder, SPDesktop *desk
{
KnotHolderEntity *e = new TtC::KnotHolderEntityLeftEnd(this);
e->create( desktop, item, knotholder, Inkscape::CTRL_TYPE_UNKNOWN,
- _("Adjust the \"left\" end of the tangent") );
+ _("Adjust the <b>left</b> end of the tangent") );
knotholder->add(e);
}
{
KnotHolderEntity *e = new TtC::KnotHolderEntityRightEnd(this);
e->create( desktop, item, knotholder, Inkscape::CTRL_TYPE_UNKNOWN,
- _("Adjust the \"right\" end of the tangent") );
+ _("Adjust the <b>right</b> end of the tangent") );
knotholder->add(e);
}
};
@@ -130,14 +128,13 @@ KnotHolderEntityAttachPt::knot_set(Geom::Point const &p, Geom::Point const &/*or
Geom::Point const s = snap_knot_position(p, state);
- // FIXME: There must be a better way of converting the path's SPCurve* to pwd2.
- SPCurve *curve = SP_PATH(item)->get_curve_for_edit();
- Geom::PathVector pathv = curve->get_pathvector();
- Piecewise<D2<SBasis> > pwd2;
- for (unsigned int i=0; i < pathv.size(); i++) {
- pwd2.concat(pathv[i].toPwSb());
+ if ( !SP_IS_SHAPE(lpe->sp_lpe_item) ) {
+ //lpe->t_attach.param_set_value(0);
+ g_warning("LPEItem is not a path! %s:%d\n", __FILE__, __LINE__);
+ return;
}
-
+ Piecewise<D2<SBasis> > pwd2 = paths_to_pw( lpe->pathvector_before_effect );
+
double t0 = nearest_point(s, pwd2);
lpe->t_attach.param_set_value(t0);
diff --git a/src/live_effects/lpe-tangent_to_curve.h b/src/live_effects/lpe-tangent_to_curve.h
index 309afc14b..8e44c01d1 100644
--- a/src/live_effects/lpe-tangent_to_curve.h
+++ b/src/live_effects/lpe-tangent_to_curve.h
@@ -34,7 +34,6 @@ class LPETangentToCurve : public Effect {
public:
LPETangentToCurve(LivePathEffectObject *lpeobject);
virtual ~LPETangentToCurve();
-
virtual Geom::Piecewise<Geom::D2<Geom::SBasis> >
doEffect_pwd2 (Geom::Piecewise<Geom::D2<Geom::SBasis> > const & pwd2_in);
diff --git a/src/live_effects/lpe-taperstroke.cpp b/src/live_effects/lpe-taperstroke.cpp
new file mode 100644
index 000000000..b595b8d55
--- /dev/null
+++ b/src/live_effects/lpe-taperstroke.cpp
@@ -0,0 +1,632 @@
+/**
+ * @file
+ * Taper Stroke path effect, provided as an alternative to Power Strokes
+ * for otherwise constant-width paths.
+ *
+ * Authors:
+ * Liam P White <inkscapebrony@gmail.com>
+ *
+ * Copyright (C) 2014 Authors
+ *
+ * Released under GNU GPL, read the file 'COPYING' for more information
+ */
+
+#include "live_effects/lpe-taperstroke.h"
+
+#include <2geom/path.h>
+#include <2geom/shape.h>
+#include <2geom/path.h>
+#include <2geom/circle.h>
+#include <2geom/sbasis-to-bezier.h>
+
+#include "pathoutlineprovider.h"
+#include "display/curve.h"
+#include "sp-shape.h"
+#include "style.h"
+#include "xml/repr.h"
+#include "sp-paint-server.h"
+#include "svg/svg-color.h"
+#include "desktop-style.h"
+#include "svg/css-ostringstream.h"
+#include "svg/svg.h"
+
+#include "knot-holder-entity.h"
+#include "knotholder.h"
+
+#include <glibmm/i18n.h>
+
+template<typename T>
+inline bool withinRange(T value, T low, T high) {
+ return (value > low && value < high);
+}
+
+namespace Inkscape {
+namespace LivePathEffect {
+
+namespace TpS {
+ class KnotHolderEntityAttachBegin : public LPEKnotHolderEntity {
+ public:
+ KnotHolderEntityAttachBegin(LPETaperStroke * effect) : LPEKnotHolderEntity(effect) {}
+ virtual void knot_set(Geom::Point const &p, Geom::Point const &origin, guint state);
+ virtual Geom::Point knot_get() const;
+ };
+
+ class KnotHolderEntityAttachEnd : public LPEKnotHolderEntity {
+ public:
+ KnotHolderEntityAttachEnd(LPETaperStroke * effect) : LPEKnotHolderEntity(effect) {}
+ virtual void knot_set(Geom::Point const &p, Geom::Point const &origin, guint state);
+ virtual Geom::Point knot_get() const;
+ };
+} // TpS
+
+static const Util::EnumData<unsigned> JoinType[] = {
+ {LINEJOIN_STRAIGHT, N_("Beveled"), "bevel"},
+ {LINEJOIN_ROUND, N_("Rounded"), "round"},
+ {LINEJOIN_REFLECTED, N_("Reflected"), "reflected"},
+ {LINEJOIN_POINTY, N_("Miter"), "miter"},
+ {LINEJOIN_EXTRAPOLATED, N_("Extrapolated"), "extrapolated"}
+};
+
+static const Util::EnumDataConverter<unsigned> JoinTypeConverter(JoinType, sizeof (JoinType)/sizeof(*JoinType));
+
+LPETaperStroke::LPETaperStroke(LivePathEffectObject *lpeobject) :
+ Effect(lpeobject),
+ line_width(_("Stroke width"), _("The (non-tapered) width of the path"), "stroke_width", &wr, this, 1.),
+ attach_start(_("Start offset"), _("Taper distance from path start"), "attach_start", &wr, this, 0.2),
+ attach_end(_("End offset"), _("The ending position of the taper"), "end_offset", &wr, this, 0.2),
+ smoothing(_("Taper smoothing"), _("Amount of smoothing to apply to the tapers"), "smoothing", &wr, this, 0.5),
+ join_type(_("Join type"), _("Join type for non-smooth nodes"), "jointype", JoinTypeConverter, &wr, this, LINEJOIN_EXTRAPOLATED),
+ miter_limit(_("Miter limit"), _("Limit for miter joins"), "miter_limit", &wr, this, 100.)
+{
+ show_orig_path = true;
+ _provides_knotholder_entities = true;
+
+ attach_start.param_set_digits(3);
+ attach_end.param_set_digits(3);
+
+ registerParameter(&line_width);
+ registerParameter(&attach_start);
+ registerParameter(&attach_end);
+ registerParameter(&smoothing);
+ registerParameter(&join_type);
+ registerParameter(&miter_limit);
+}
+
+// from LPEPowerStroke -- sets fill if stroke color because we will
+// be converting to a fill to make the new join.
+
+void LPETaperStroke::doOnApply(SPLPEItem const* lpeitem)
+{
+ if (SP_IS_SHAPE(lpeitem)) {
+ SPLPEItem* item = const_cast<SPLPEItem*>(lpeitem);
+ double width = (lpeitem && lpeitem->style) ? lpeitem->style->stroke_width.computed : 1.;
+
+ SPCSSAttr *css = sp_repr_css_attr_new ();
+ if (true) {
+ if (lpeitem->style->stroke.isPaintserver()) {
+ SPPaintServer * server = lpeitem->style->getStrokePaintServer();
+ if (server) {
+ Glib::ustring str;
+ str += "url(#";
+ str += server->getId();
+ str += ")";
+ sp_repr_css_set_property (css, "fill", str.c_str());
+ }
+ } else if (lpeitem->style->stroke.isColor()) {
+ gchar c[64];
+ sp_svg_write_color (c, sizeof(c), lpeitem->style->stroke.value.color.toRGBA32(SP_SCALE24_TO_FLOAT(lpeitem->style->stroke_opacity.value)));
+ sp_repr_css_set_property (css, "fill", c);
+ } else {
+ sp_repr_css_set_property (css, "fill", "none");
+ }
+ } else {
+ sp_repr_css_unset_property (css, "fill");
+ }
+
+ sp_repr_css_set_property(css, "stroke", "none");
+
+ sp_desktop_apply_css_recursive(item, css, true);
+ sp_repr_css_attr_unref (css);
+
+ line_width.param_set_value(width);
+ } else {
+ printf("WARNING: It only makes sense to apply Join Type to paths (not groups).\n");
+ }
+}
+
+// from LPEPowerStroke -- sets stroke color from existing fill color
+
+void LPETaperStroke::doOnRemove(SPLPEItem const* lpeitem)
+{
+ if (SP_IS_SHAPE(lpeitem)) {
+ SPLPEItem *item = const_cast<SPLPEItem*>(lpeitem);
+
+ SPCSSAttr *css = sp_repr_css_attr_new ();
+ if (true) {
+ if (lpeitem->style->fill.isPaintserver()) {
+ SPPaintServer * server = lpeitem->style->getFillPaintServer();
+ if (server) {
+ Glib::ustring str;
+ str += "url(#";
+ str += server->getId();
+ str += ")";
+ sp_repr_css_set_property (css, "stroke", str.c_str());
+ }
+ } else if (lpeitem->style->fill.isColor()) {
+ gchar c[64];
+ sp_svg_write_color (c, sizeof(c), lpeitem->style->stroke.value.color.toRGBA32(SP_SCALE24_TO_FLOAT(lpeitem->style->stroke_opacity.value)));
+ sp_repr_css_set_property (css, "stroke", c);
+ } else {
+ sp_repr_css_set_property (css, "stroke", "none");
+ }
+ } else {
+ sp_repr_css_unset_property (css, "stroke");
+ }
+
+ Inkscape::CSSOStringStream os;
+ os << fabs(line_width);
+ sp_repr_css_set_property (css, "stroke-width", os.str().c_str());
+
+ sp_repr_css_set_property(css, "fill", "none");
+
+ sp_desktop_apply_css_recursive(item, css, true);
+ sp_repr_css_attr_unref (css);
+ }
+}
+
+using Geom::Piecewise;
+using Geom::D2;
+using Geom::SBasis;
+// leave Geom::Path
+
+Geom::Path return_at_first_cusp(Geom::Path const & path_in, double /*smooth_tolerance*/ = 0.05) {
+ return Geom::split_at_cusps(path_in)[0];
+}
+
+Piecewise<D2<SBasis> > stretch_along(Piecewise<D2<SBasis> > pwd2_in, Geom::Path pattern, double width);
+
+// references to pointers
+void subdivideCurve(Geom::Curve * curve_in, Geom::Coord t, Geom::Curve *& val_first, Geom::Curve *& val_second);
+
+// actual effect
+
+Geom::PathVector LPETaperStroke::doEffect_path(Geom::PathVector const& path_in)
+{
+ Geom::Path first_cusp = return_at_first_cusp(path_in[0]);
+ Geom::Path last_cusp = return_at_first_cusp(path_in[0].reverse());
+
+ bool zeroStart = false; // [distance from start taper knot -> start of path] == 0
+ bool zeroEnd = false; // [distance from end taper knot -> end of path] == 0
+ bool metInMiddle = false; // knots are touching
+
+ // there is a pretty good chance that people will try to drag the knots
+ // on top of each other, so block it
+
+ unsigned size = path_in[0].size();
+ if (size == first_cusp.size()) {
+ // check to see if the knots were dragged over each other
+ // if so, reset the end offset, but still allow the start offset.
+ if ( attach_start >= (size - attach_end) ) {
+ attach_end.param_set_value( size - attach_start );
+ metInMiddle = true;
+ }
+ }
+
+ if (attach_start == size - attach_end) {
+ metInMiddle = true;
+ }
+ if (attach_end == size - attach_start) {
+ metInMiddle = true;
+ }
+
+ // don't let it be integer (TODO this is stupid!)
+ {
+ if (double(unsigned(attach_start)) == attach_start) {
+ attach_start.param_set_value(attach_start - 0.00001);
+ }
+ if (double(unsigned(attach_end)) == attach_end) {
+ attach_end.param_set_value(attach_end - 0.00001);
+ }
+ }
+
+ unsigned allowed_start = first_cusp.size();
+ unsigned allowed_end = last_cusp.size();
+
+ // don't let the knots be farther than they are allowed to be
+ {
+ if ((unsigned)attach_start >= allowed_start) {
+ attach_start.param_set_value((double)allowed_start - 0.00001);
+ }
+ if ((unsigned)attach_end >= allowed_end) {
+ attach_end.param_set_value((double)allowed_end - 0.00001);
+ }
+ }
+
+ // don't let it be zero (this is stupid too!)
+ if (attach_start < 0.0000001 || withinRange(double(attach_start), 0.00000001, 0.000001)) {
+ attach_start.param_set_value( 0.0000001 );
+ zeroStart = true;
+ }
+ if (attach_end < 0.0000001 || withinRange(double(attach_end), 0.00000001, 0.000001)) {
+ attach_end.param_set_value( 0.0000001 );
+ zeroEnd = true;
+ }
+
+ // Path::operator () means get point at time t
+ start_attach_point = first_cusp(attach_start);
+ end_attach_point = last_cusp(attach_end);
+ Geom::PathVector pathv_out;
+
+ // the following function just splits it up into three pieces.
+ pathv_out = doEffect_simplePath(path_in);
+
+ // now for the actual tapering. the stretch_along method (stolen from PaP) is used to accomplish this
+
+ Geom::PathVector real_pathv;
+ Geom::Path real_path;
+ Geom::PathVector pat_vec;
+ Piecewise<D2<SBasis> > pwd2;
+ Geom::Path throwaway_path;
+
+ if (!zeroStart) {
+ // Construct the pattern
+ std::stringstream pat_str;
+ pat_str.imbue(std::locale::classic());
+ pat_str << "M 1,0 C " << 1 - (double)smoothing << ",0 0,0.5 0,0.5 0,0.5 " << 1 - (double)smoothing << ",1 1,1";
+
+ pat_vec = sp_svg_read_pathv(pat_str.str().c_str());
+ pwd2.concat(stretch_along(pathv_out[0].toPwSb(), pat_vec[0], -fabs(line_width)));
+ throwaway_path = Geom::path_from_piecewise(pwd2, LPE_CONVERSION_TOLERANCE)[0];
+
+ real_path.append(throwaway_path);
+ }
+
+ // if this condition happens to evaluate false, i.e. there was no space for a path to be drawn, it is simply skipped.
+ // although this seems obvious, it can probably lead to bugs.
+ if (!metInMiddle) {
+ // append the outside outline of the path (goes with the direction of the path)
+ throwaway_path = Outline::PathOutsideOutline(pathv_out[1], -fabs(line_width), static_cast<LineJoinType>(join_type.get_value()), miter_limit);
+ if (!zeroStart && real_path.size() >= 1 && throwaway_path.size() >= 1) {
+ if (!Geom::are_near(real_path.finalPoint(), throwaway_path.initialPoint())) {
+ real_path.appendNew<Geom::LineSegment>(throwaway_path.initialPoint());
+ } else {
+ real_path.setFinal(throwaway_path.initialPoint());
+ }
+ }
+ real_path.append(throwaway_path);
+ }
+
+ if (!zeroEnd) {
+ // append the ending taper
+ std::stringstream pat_str_1;
+ pat_str_1.imbue(std::locale::classic());
+ pat_str_1 << "M 0,1 C " << (double)smoothing << ",1 1,0.5 1,0.5 1,0.5 " << double(smoothing) << ",0 0,0";
+ pat_vec = sp_svg_read_pathv(pat_str_1.str().c_str());
+
+ pwd2 = Piecewise<D2<SBasis> >();
+ pwd2.concat(stretch_along(pathv_out[2].toPwSb(), pat_vec[0], -fabs(line_width)));
+
+ throwaway_path = Geom::path_from_piecewise(pwd2, LPE_CONVERSION_TOLERANCE)[0];
+ if (!Geom::are_near(real_path.finalPoint(), throwaway_path.initialPoint()) && real_path.size() >= 1) {
+ real_path.appendNew<Geom::LineSegment>(throwaway_path.initialPoint());
+ } else {
+ real_path.setFinal(throwaway_path.initialPoint());
+ }
+ real_path.append(throwaway_path);
+ }
+
+ if (!metInMiddle) {
+ // append the inside outline of the path (against direction)
+ throwaway_path = Outline::PathOutsideOutline(pathv_out[1].reverse(), -fabs(line_width), static_cast<LineJoinType>(join_type.get_value()), miter_limit);
+
+ if (!Geom::are_near(real_path.finalPoint(), throwaway_path.initialPoint()) && real_path.size() >= 1) {
+ real_path.appendNew<Geom::LineSegment>(throwaway_path.initialPoint());
+ } else {
+ real_path.setFinal(throwaway_path.initialPoint());
+ }
+ real_path.append(throwaway_path);
+ }
+
+ if (!Geom::are_near(real_path.finalPoint(), real_path.initialPoint())) {
+ real_path.appendNew<Geom::LineSegment>(real_path.initialPoint());
+ } else {
+ real_path.setFinal(real_path.initialPoint());
+ }
+ real_path.close();
+
+ real_pathv.push_back(real_path);
+
+ return real_pathv;
+}
+
+/**
+ * @return Always returns a PathVector with three elements.
+ *
+ * The positions of the effect knots are accessed to determine
+ * where exactly the input path should be split.
+ */
+Geom::PathVector LPETaperStroke::doEffect_simplePath(Geom::PathVector const & path_in)
+{
+ size_t size = path_in[0].size();
+
+ unsigned loc = (unsigned)attach_start;
+ Geom::Curve * curve_start = path_in[0] [loc].duplicate();
+
+ std::vector<Geom::Path> pathv_out;
+ Geom::Path path_out = Geom::Path();
+
+ Geom::Path trimmed_start = Geom::Path();
+ Geom::Path trimmed_end = Geom::Path();
+
+ for (size_t i = 0; i < loc; ++i) {
+ trimmed_start.append(path_in[0] [i]);
+ }
+
+ Geom::Curve * temp;
+ subdivideCurve(curve_start, attach_start - loc, temp, curve_start);
+ trimmed_start.append(*temp);
+ if (temp) delete temp; temp = 0;
+
+ // special case: path is one segment long
+ // special case: what if the two knots occupy the same segment?
+ if ((size == 1) || ( size - unsigned(attach_end) - 1 == loc )) {
+
+ // If you look into it, I don't actually think there is a working way to do this
+ // with only point math. So we use nearest_point instead.
+ Geom::Coord t = Geom::nearest_point(end_attach_point, *curve_start);
+
+ // it is just a dumb segment
+ // we have to do some shifting here because the value changed when we reduced the length
+ // of the previous segment.
+
+ subdivideCurve(curve_start, t, curve_start, temp);
+ trimmed_end.append(*temp);
+ if (temp) delete temp; temp = 0;
+
+ for (size_t j = (size - attach_end) + 1; j < size; ++j) {
+ trimmed_end.append(path_in[0] [j]);
+ }
+
+ path_out.append(*curve_start);
+ pathv_out.push_back(trimmed_start);
+ pathv_out.push_back(path_out);
+ pathv_out.push_back(trimmed_end);
+ return pathv_out;
+ }
+
+ pathv_out.push_back(trimmed_start);
+
+ // append almost all of the rest of the path, ignore the curves that the knot is past (we'll get to it in a minute)
+ path_out.append(*curve_start);
+
+ for (size_t k = loc + 1; k < (size - unsigned(attach_end)) - 1; ++k) {
+ path_out.append(path_in[0] [k]);
+ }
+
+ // deal with the last segment in a very similar fashion to the first
+ loc = size - attach_end;
+
+ Geom::Curve * curve_end = path_in[0] [loc].duplicate();
+
+ Geom::Coord t = Geom::nearest_point(end_attach_point, *curve_end);
+
+ subdivideCurve(curve_end, t, curve_end, temp);
+ trimmed_end.append(*temp);
+ if (temp) delete temp; temp = 0;
+
+ for (size_t j = (size - attach_end) + 1; j < size; ++j) {
+ trimmed_end.append(path_in[0] [j]);
+ }
+
+ path_out.append(*curve_end);
+ pathv_out.push_back(path_out);
+
+ pathv_out.push_back(trimmed_end);
+
+ if (curve_end) delete curve_end;
+ if (curve_start) delete curve_start;
+ return pathv_out;
+}
+
+
+/**
+ * Most of the below function is verbatim from Pattern Along Path. However, it needed a little
+ * tweaking to get it to work right in this case. Also, large portions of the effect have been
+ * stripped out as I deemed them unnecessary for the relative simplicity of this effect.
+ */
+Piecewise<D2<SBasis> > stretch_along(Piecewise<D2<SBasis> > pwd2_in, Geom::Path pattern, double prop_scale)
+{
+ using namespace Geom;
+
+ // Don't allow empty path parameter:
+ if ( pattern.empty() ) {
+ return pwd2_in;
+ }
+
+ /* Much credit should go to jfb and mgsloan of lib2geom development for the code below! */
+ Piecewise<D2<SBasis> > output;
+ std::vector<Piecewise<D2<SBasis> > > pre_output;
+
+ D2<Piecewise<SBasis> > patternd2 = make_cuts_independent(pattern.toPwSb());
+ Piecewise<SBasis> x0 = Piecewise<SBasis>(patternd2[0]);
+ Piecewise<SBasis> y0 = Piecewise<SBasis>(patternd2[1]);
+ OptInterval pattBndsX = bounds_exact(x0);
+ OptInterval pattBndsY = bounds_exact(y0);
+ if (pattBndsX && pattBndsY) {
+ x0 -= pattBndsX->min();
+ y0 -= pattBndsY->middle();
+
+ double xspace = 0;
+ double noffset = 0;
+ double toffset = 0;
+ // Prevent more than 90% overlap...
+ if (xspace < -pattBndsX->extent()*.9) {
+ xspace = -pattBndsX->extent()*.9;
+ }
+
+ y0+=noffset;
+
+ std::vector<Piecewise<D2<SBasis> > > paths_in;
+ paths_in = split_at_discontinuities(pwd2_in);
+
+ for (unsigned idx = 0; idx < paths_in.size(); idx++) {
+ Piecewise<D2<SBasis> > path_i = paths_in[idx];
+ Piecewise<SBasis> x = x0;
+ Piecewise<SBasis> y = y0;
+ Piecewise<D2<SBasis> > uskeleton = arc_length_parametrization(path_i,2,.1);
+ uskeleton = remove_short_cuts(uskeleton,.01);
+ Piecewise<D2<SBasis> > n = rot90(derivative(uskeleton));
+ n = force_continuity(remove_short_cuts(n,.1));
+
+ int nbCopies = 0;
+ double scaling = 1;
+ nbCopies = 1;
+ scaling = (uskeleton.domain().extent() - toffset)/pattBndsX->extent();
+
+ double pattWidth = pattBndsX->extent() * scaling;
+
+ if (scaling != 1.0) {
+ x*=scaling;
+ }
+ if ( false ) {
+ y*=(scaling*prop_scale);
+ } else {
+ if (prop_scale != 1.0) y *= prop_scale;
+ }
+ x += toffset;
+
+ double offs = 0;
+ for (int i=0; i<nbCopies; i++) {
+ if (false) {
+ Piecewise<D2<SBasis> > output_piece = compose(uskeleton,x+offs)+y*compose(n,x+offs);
+ std::vector<Piecewise<D2<SBasis> > > splited_output_piece = split_at_discontinuities(output_piece);
+ pre_output.insert(pre_output.end(), splited_output_piece.begin(), splited_output_piece.end() );
+ } else {
+ output.concat(compose(uskeleton,x+offs)+y*compose(n,x+offs));
+ }
+ offs+=pattWidth;
+ }
+ }
+ return output;
+ } else {
+ return pwd2_in;
+ }
+}
+
+void subdivideCurve(Geom::Curve * curve_in, Geom::Coord t, Geom::Curve *& val_first, Geom::Curve *& val_second)
+{
+ if (Geom::LineSegment* linear = dynamic_cast<Geom::LineSegment*>(curve_in)) {
+ // special case for line segments
+ std::pair<Geom::LineSegment, Geom::LineSegment> seg_pair = linear->subdivide(t);
+ val_first = seg_pair.first.duplicate();
+ val_second = seg_pair.second.duplicate();
+ } else {
+ // all other cases:
+ Geom::CubicBezier cubic = Geom::sbasis_to_cubicbezier(curve_in->toSBasis());
+ std::pair<Geom::CubicBezier, Geom::CubicBezier> cubic_pair = cubic.subdivide(t);
+ val_first = cubic_pair.first.duplicate();
+ val_second = cubic_pair.second.duplicate();
+ }
+}
+
+
+void LPETaperStroke::addKnotHolderEntities(KnotHolder *knotholder, SPDesktop *desktop, SPItem *item)
+{
+ KnotHolderEntity *e = new TpS::KnotHolderEntityAttachBegin(this);
+ e->create(desktop, item, knotholder, Inkscape::CTRL_TYPE_UNKNOWN, _("Start point of the taper"), SP_KNOT_SHAPE_CIRCLE);
+ knotholder->add(e);
+
+ KnotHolderEntity *f = new TpS::KnotHolderEntityAttachEnd(this);
+ f->create(desktop, item, knotholder, Inkscape::CTRL_TYPE_UNKNOWN, _("End point of the taper"), SP_KNOT_SHAPE_CIRCLE);
+ knotholder->add(f);
+}
+
+namespace TpS {
+
+void KnotHolderEntityAttachBegin::knot_set(Geom::Point const &p, Geom::Point const&/*origin*/, guint state)
+{
+ using namespace Geom;
+
+ LPETaperStroke* lpe = dynamic_cast<LPETaperStroke *>(_effect);
+
+ Geom::Point const s = snap_knot_position(p, state);
+
+ if (!SP_IS_SHAPE(lpe->sp_lpe_item)) {
+ printf("WARNING: LPEItem is not a path!\n");
+ return;
+ }
+
+ SPCurve* curve;
+ if (!(curve = SP_SHAPE(lpe->sp_lpe_item)->getCurve())) {
+ // oops
+ return;
+ }
+ // in case you are wondering, the above are simply sanity checks. we never want to actually
+ // use that object.
+
+ Geom::PathVector pathv = lpe->pathvector_before_effect;
+
+ Piecewise<D2<SBasis> > pwd2;
+ Geom::Path p_in = return_at_first_cusp(pathv[0]);
+ pwd2.concat(p_in.toPwSb());
+
+ double t0 = nearest_point(s, pwd2);
+ lpe->attach_start.param_set_value(t0);
+
+ // 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 KnotHolderEntityAttachEnd::knot_set(Geom::Point const &p, Geom::Point const& /*origin*/, guint state)
+{
+ using namespace Geom;
+
+ LPETaperStroke* lpe = dynamic_cast<LPETaperStroke *>(_effect);
+
+ Geom::Point const s = snap_knot_position(p, state);
+
+ if (!SP_IS_SHAPE(lpe->sp_lpe_item) ) {
+ printf("WARNING: LPEItem is not a path!\n");
+ return;
+ }
+
+ SPCurve* curve;
+ if ( !(curve = SP_SHAPE(lpe->sp_lpe_item)->getCurve()) ) {
+ // oops
+ return;
+ }
+ Geom::PathVector pathv = lpe->pathvector_before_effect;
+ Geom::Path p_in = return_at_first_cusp(pathv[0].reverse());
+ Piecewise<D2<SBasis> > pwd2 = p_in.toPwSb();
+
+ double t0 = nearest_point(s, pwd2);
+ lpe->attach_end.param_set_value(t0);
+
+ sp_lpe_item_update_patheffect (SP_LPE_ITEM(item), false, true);
+}
+
+Geom::Point KnotHolderEntityAttachBegin::knot_get() const
+{
+ LPETaperStroke const * lpe = dynamic_cast<LPETaperStroke const*> (_effect);
+ return lpe->start_attach_point;
+}
+
+Geom::Point KnotHolderEntityAttachEnd::knot_get() const
+{
+ LPETaperStroke const * lpe = dynamic_cast<LPETaperStroke const*> (_effect);
+ return lpe->end_attach_point;
+}
+
+} // namespace TpS
+} // namespace LivePathEffect
+} // namespace Inkscape
+
+/*
+ Local Variables:
+ mode:c++
+ c-file-style:"stroustrup"
+ c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
+ indent-tabs-mode:nil
+ fill-column:99
+ End:
+*/
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8 :
diff --git a/src/live_effects/lpe-taperstroke.h b/src/live_effects/lpe-taperstroke.h
new file mode 100644
index 000000000..88604486e
--- /dev/null
+++ b/src/live_effects/lpe-taperstroke.h
@@ -0,0 +1,72 @@
+/** @file
+ * @brief Taper Stroke path effect (meant as a replacement for using Power Strokes for tapering)
+ */
+/* Authors:
+ * Liam P White <inkscapebrony@gmail.com>
+ * Copyright (C) 2014 Authors
+ *
+ * Released under GNU GPL, read the file 'COPYING' for more information
+ */
+
+#ifndef INKSCAPE_LPE_TAPERSTROKE_H
+#define INKSCAPE_LPE_TAPERSTROKE_H
+
+#include "live_effects/parameter/enum.h"
+#include "live_effects/effect.h"
+#include "live_effects/parameter/parameter.h"
+#include "live_effects/parameter/vector.h"
+
+namespace Inkscape {
+namespace LivePathEffect {
+
+namespace TpS {
+// we need a separate namespace to avoid clashes with other LPEs
+class KnotHolderEntityAttachBegin;
+class KnotHolderEntityAttachEnd;
+}
+
+class LPETaperStroke : public Effect {
+public:
+ LPETaperStroke(LivePathEffectObject *lpeobject);
+ virtual ~LPETaperStroke() {}
+
+ virtual void doOnApply(SPLPEItem const* lpeitem);
+ virtual void doOnRemove(SPLPEItem const* lpeitem);
+
+ virtual Geom::PathVector doEffect_path (Geom::PathVector const& path_in);
+ Geom::PathVector doEffect_simplePath(Geom::PathVector const& path_in);
+
+ virtual void addKnotHolderEntities(KnotHolder * knotholder, SPDesktop * desktop, SPItem * item);
+
+ friend class TpS::KnotHolderEntityAttachBegin;
+ friend class TpS::KnotHolderEntityAttachEnd;
+private:
+ ScalarParam line_width;
+ ScalarParam attach_start;
+ ScalarParam attach_end;
+ ScalarParam smoothing;
+ EnumParam<unsigned> join_type;
+ ScalarParam miter_limit;
+
+ Geom::Point start_attach_point;
+ Geom::Point end_attach_point;
+
+ LPETaperStroke(const LPETaperStroke&);
+ LPETaperStroke& operator=(const LPETaperStroke&);
+};
+
+} //namespace LivePathEffect
+} //namespace Inkscape
+
+#endif
+
+/*
+ Local Variables:
+ mode:c++
+ c-file-style:"stroustrup"
+ c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
+ indent-tabs-mode:nil
+ fill-column:99
+ End:
+*/
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8 :
diff --git a/src/live_effects/lpe-vonkoch.cpp b/src/live_effects/lpe-vonkoch.cpp
index 709c9e56e..b52816c87 100644
--- a/src/live_effects/lpe-vonkoch.cpp
+++ b/src/live_effects/lpe-vonkoch.cpp
@@ -262,6 +262,9 @@ LPEVonKoch::doBeforeEffect (SPLPEItem const* lpeitem)
tmp_pathv.push_back(tmp_path);
ref_path.set_new_value(tmp_pathv,true);
}
+ SPLPEItem * item = const_cast<SPLPEItem*>(lpeitem);
+ item->apply_to_clippath(item);
+ item->apply_to_mask(item);
}
diff --git a/src/live_effects/lpeobject-reference.h b/src/live_effects/lpeobject-reference.h
index b1ba1ee4e..374e715ec 100644
--- a/src/live_effects/lpeobject-reference.h
+++ b/src/live_effects/lpeobject-reference.h
@@ -9,10 +9,10 @@
* Released under GNU GPL, read the file 'COPYING' for more information.
*/
-#include <uri-references.h>
-#include <stddef.h>
#include <sigc++/sigc++.h>
+#include "uri-references.h"
+
namespace Inkscape {
namespace XML {
class Node;
@@ -33,7 +33,7 @@ public:
SPObject *owner;
// concerning the LPEObject that is refered to:
- gchar *lpeobject_href;
+ char *lpeobject_href;
Inkscape::XML::Node *lpeobject_repr;
LivePathEffectObject *lpeobject;
diff --git a/src/live_effects/lpeobject.h b/src/live_effects/lpeobject.h
index 9700024fe..2e62707e3 100644
--- a/src/live_effects/lpeobject.h
+++ b/src/live_effects/lpeobject.h
@@ -47,9 +47,9 @@ protected:
virtual void build(SPDocument* doc, Inkscape::XML::Node* repr);
virtual void release();
- virtual void set(unsigned int key, const gchar* value);
+ virtual void set(unsigned int key, char const* value);
- virtual Inkscape::XML::Node* write(Inkscape::XML::Document* doc, Inkscape::XML::Node* repr, guint flags);
+ virtual Inkscape::XML::Node* write(Inkscape::XML::Document* doc, Inkscape::XML::Node* repr, unsigned int flags);
};
#endif
diff --git a/src/live_effects/parameter/Makefile_insert b/src/live_effects/parameter/Makefile_insert
index efdda686a..f990f41c7 100644
--- a/src/live_effects/parameter/Makefile_insert
+++ b/src/live_effects/parameter/Makefile_insert
@@ -11,6 +11,8 @@ ink_common_sources += \
live_effects/parameter/random.h \
live_effects/parameter/point.cpp \
live_effects/parameter/point.h \
+ live_effects/parameter/pointreseteable.cpp \
+ live_effects/parameter/pointreseteable.h \
live_effects/parameter/enum.h \
live_effects/parameter/path-reference.cpp \
live_effects/parameter/path-reference.h \
@@ -18,10 +20,18 @@ ink_common_sources += \
live_effects/parameter/path.h \
live_effects/parameter/originalpath.cpp \
live_effects/parameter/originalpath.h \
+ live_effects/parameter/originalpatharray.cpp \
+ live_effects/parameter/originalpatharray.h \
live_effects/parameter/powerstrokepointarray.cpp \
live_effects/parameter/powerstrokepointarray.h \
+ live_effects/parameter/filletchamferpointarray.cpp \
+ live_effects/parameter/filletchamferpointarray.h \
live_effects/parameter/text.cpp \
live_effects/parameter/text.h \
+ live_effects/parameter/transformedpoint.cpp \
+ live_effects/parameter/transformedpoint.h \
+ live_effects/parameter/togglebutton.cpp \
+ live_effects/parameter/togglebutton.h \
live_effects/parameter/unit.cpp \
live_effects/parameter/unit.h \
live_effects/parameter/vector.cpp \
diff --git a/src/live_effects/parameter/bool.h b/src/live_effects/parameter/bool.h
index fafb1beca..b45eeb0b3 100644
--- a/src/live_effects/parameter/bool.h
+++ b/src/live_effects/parameter/bool.h
@@ -4,7 +4,7 @@
/*
* Inkscape::LivePathEffectParameters
*
-* Copyright (C) Johan Engelen 2007 <j.b.c.engelen@utwente.nl>
+ * Copyright (C) Johan Engelen 2007 <j.b.c.engelen@utwente.nl>
*
* Released under GNU GPL, read the file 'COPYING' for more information
*/
diff --git a/src/live_effects/parameter/filletchamferpointarray.cpp b/src/live_effects/parameter/filletchamferpointarray.cpp
new file mode 100644
index 000000000..e2b1aba61
--- /dev/null
+++ b/src/live_effects/parameter/filletchamferpointarray.cpp
@@ -0,0 +1,882 @@
+/*
+ * Copyright (C) Jabiertxo Arraiza Cenoz <jabier.arraiza@marker.es>
+ * Special thanks to Johan Engelen for the base of the effect -powerstroke-
+ * Also to ScislaC for point me to the idea
+ * Also su_v for his construvtive feedback and time
+ * and finaly to Liam P. White for his big help on coding, that save me a lot of
+ * hours
+ * Released under GNU GPL, read the file 'COPYING' for more information
+ */
+
+#include <2geom/piecewise.h>
+#include <2geom/sbasis-to-bezier.h>
+#include <2geom/sbasis-geometric.h>
+#include <2geom/svg-elliptical-arc.h>
+#include <2geom/line.h>
+#include <2geom/path-intersection.h>
+
+#include "ui/dialog/lpe-fillet-chamfer-properties.h"
+#include "live_effects/parameter/filletchamferpointarray.h"
+#include "live_effects/effect.h"
+#include "svg/svg.h"
+#include "svg/stringstream.h"
+#include "knotholder.h"
+#include "sp-lpe-item.h"
+#include "selection.h"
+
+// needed for on-canvas editting:
+#include "desktop.h"
+#include "live_effects/lpeobject.h"
+#include "helper/geom-nodetype.h"
+#include "helper/geom-curves.h"
+#include "ui/tools/node-tool.h"
+
+// TODO due to internal breakage in glibmm headers,
+// this has to be included last.
+#include <glibmm/i18n.h>
+
+
+using namespace Geom;
+
+namespace Inkscape {
+
+namespace LivePathEffect {
+
+FilletChamferPointArrayParam::FilletChamferPointArrayParam(
+ const Glib::ustring &label, const Glib::ustring &tip,
+ const Glib::ustring &key, Inkscape::UI::Widget::Registry *wr,
+ Effect *effect)
+ : ArrayParam<Point>(label, tip, key, wr, effect, 0)
+{
+ knot_shape = SP_KNOT_SHAPE_DIAMOND;
+ knot_mode = SP_KNOT_MODE_XOR;
+ knot_color = 0x00ff0000;
+}
+
+FilletChamferPointArrayParam::~FilletChamferPointArrayParam() {}
+
+Gtk::Widget *FilletChamferPointArrayParam::param_newWidget()
+{
+ return NULL;
+ /*
+ Inkscape::UI::Widget::RegisteredTransformedPoint * pointwdg =
+ Gtk::manage(
+ new Inkscape::UI::Widget::RegisteredTransformedPoint(
+ param_label,
+ param_tooltip,
+ param_key,
+ *param_wr,
+ param_effect->getRepr(),
+ param_effect->getSPDoc()
+ ) );
+ // TODO: fix to get correct desktop (don't use SP_ACTIVE_DESKTOP)
+ SPDesktop *desktop = SP_ACTIVE_DESKTOP;
+ Affine transf = desktop->doc2dt();
+ pointwdg->setTransform(transf);
+ pointwdg->setValue( *this );
+ pointwdg->clearProgrammatically();
+ pointwdg->set_undo_parameters(SP_VERB_DIALOG_LIVE_PATH_EFFECT,
+ _("Change point parameter"));
+
+ Gtk::HBox * hbox = Gtk::manage( new Gtk::HBox() );
+ static_cast<Gtk::HBox*>(hbox)->pack_start(*pointwdg, true, true);
+ static_cast<Gtk::HBox*>(hbox)->show_all_children();
+
+ return dynamic_cast<Gtk::Widget *> (hbox);
+ */
+}
+
+void
+FilletChamferPointArrayParam::param_transform_multiply(Affine const &postmul,
+ bool /*set*/)
+{
+ Inkscape::Preferences *prefs = Inkscape::Preferences::get();
+
+ if (prefs->getBool("/options/transform/rectcorners", true) &&
+ _vector[1][X] <= 0) {
+ std::vector<Geom::Point> result;
+ for (std::vector<Point>::const_iterator point_it = _vector.begin();
+ point_it != _vector.end(); ++point_it) {
+ Coord A =
+ (*point_it)[X] * ((postmul.expansionX() + postmul.expansionY()) / 2);
+ result.push_back(Point(A, (*point_it)[Y]));
+ }
+ param_set_and_write_new_value(result);
+ }
+
+ // param_set_and_write_new_value( (*this) * postmul );
+}
+
+/** call this method to recalculate the controlpoints such that they stay at the
+ * same location relative to the new path. Useful after adding/deleting nodes to
+ * the path.*/
+void FilletChamferPointArrayParam::recalculate_controlpoints_for_new_pwd2(
+ Piecewise<D2<SBasis> > const &pwd2_in)
+{
+ if (!last_pwd2.empty()) {
+ PathVector const pathv =
+ path_from_piecewise(remove_short_cuts(pwd2_in, 0.1), 0.001);
+ PathVector last_pathv =
+ path_from_piecewise(remove_short_cuts(last_pwd2, 0.1), 0.001);
+ std::vector<Point> result;
+ unsigned long counter = 0;
+ unsigned long counterPaths = 0;
+ unsigned long counterCurves = 0;
+ long offset = 0;
+ long offsetPaths = 0;
+ Geom::NodeType nodetype;
+ for (PathVector::const_iterator path_it = pathv.begin();
+ path_it != pathv.end(); ++path_it) {
+ if (path_it->empty()) {
+ counterPaths++;
+ counter++;
+ continue;
+ }
+ Geom::Path::const_iterator curve_it1 = path_it->begin();
+ Geom::Path::const_iterator curve_it2 = ++(path_it->begin());
+ Geom::Path::const_iterator curve_endit = path_it->end_default();
+ if (path_it->closed() && path_it->back_closed().isDegenerate()) {
+ const Curve &closingline = path_it->back_closed();
+ if (are_near(closingline.initialPoint(), closingline.finalPoint())) {
+ curve_endit = path_it->end_open();
+ }
+ }
+ counterCurves = 0;
+ while (curve_it1 != curve_endit) {
+ //if start a path get node type
+ if (counterCurves == 0) {
+ if (path_it->closed()) {
+ if (path_it->back_closed().isDegenerate()) {
+ nodetype = get_nodetype(path_it->back_open(), *curve_it1);
+ } else {
+ nodetype = get_nodetype(path_it->back_closed(), *curve_it1);
+ }
+ } else {
+ nodetype = NODE_NONE;
+ }
+ } else {
+ //check node type also whith straight lines because get_nodetype
+ //return non cusp node in a node inserted inside a straight line
+ //todo: if the path remove some nodes whith the result of a straight
+ //line but with handles, the node inserted into dont fire the knot
+ // because is not handle as cusp node by get_nodetype function
+ bool this_is_line = true;
+ bool next_is_line = is_straight_curve(*curve_it1);
+ this_is_line = is_straight_curve((*path_it)[counterCurves - 1]);
+ nodetype = get_nodetype((*path_it)[counterCurves - 1], *curve_it1);
+ if (this_is_line || next_is_line) {
+ nodetype = NODE_CUSP;
+ }
+ }
+ if (last_pathv.size() > pathv.size() ||
+ (last_pathv.size() > counterPaths &&
+ last_pathv[counterPaths].size() > counter - offset &&
+ !are_near(curve_it1->initialPoint(),
+ last_pathv[counterPaths][counter - offset].initialPoint(),
+ 0.1))) {
+ if ( curve_it2 == curve_endit) {
+ if (last_pathv[counterPaths].size() < pathv[counterPaths].size()) {
+ offset = abs(last_pathv[counterPaths].size() -
+ pathv[counterPaths].size());
+ } else if (last_pathv[counterPaths].size() >
+ pathv[counterPaths].size()) {
+ offset = (abs(last_pathv[counterPaths].size() -
+ pathv[counterPaths].size())) * -1;
+ } else {
+ offset = 0;
+ }
+ offsetPaths += offset;
+ offset = offsetPaths;
+ } else if (counterCurves == 0 && last_pathv.size() <= pathv.size() &&
+ counter - offset <= last_pathv[counterPaths].size() &&
+ are_near(curve_it1->initialPoint(),
+ last_pathv[counterPaths].finalPoint(), 0.1) &&
+ !last_pathv[counterPaths].closed()) {
+ long e = counter - offset + 1;
+ std::vector<Point> tmp = _vector;
+ for (unsigned long i =
+ last_pathv[counterPaths].size() + counter - offset;
+ i > counterCurves - offset + 1; i--) {
+
+ if (tmp[i - 1][X] > 0) {
+ double fractpart, intpart;
+ fractpart = modf(tmp[i - 1][X], &intpart);
+ _vector[e] = Point(e + fractpart, tmp[i - 1][Y]);
+ } else {
+ _vector[e] = Point(tmp[i - 1][X], tmp[i - 1][Y]);
+ }
+ e++;
+ }
+ //delete temp vector
+ std::vector<Point>().swap(tmp);
+ if (last_pathv.size() > counterPaths) {
+ last_pathv[counterPaths] = last_pathv[counterPaths].reverse();
+ }
+ } else {
+ if (last_pathv.size() > counterPaths) {
+ if (last_pathv[counterPaths].size() <
+ pathv[counterPaths].size()) {
+ offset++;
+ } else if (last_pathv[counterPaths].size() >
+ pathv[counterPaths].size()) {
+ offset--;
+ continue;
+ }
+ } else {
+ offset++;
+ }
+ }
+ double xPos = 0;
+ if (_vector[1][X] > 0) {
+ xPos = nearest_point(curve_it1->initialPoint(), pwd2_in);
+ }
+ if (nodetype == NODE_CUSP) {
+ result.push_back(Point(xPos, 1));
+ } else {
+ result.push_back(Point(xPos, 0));
+ }
+ } else {
+ double xPos = _vector[counter - offset][X];
+ if (_vector.size() <= (unsigned)(counter - offset)) {
+ if (_vector[1][X] > 0) {
+ xPos = nearest_point(curve_it1->initialPoint(), pwd2_in);
+ } else {
+ xPos = 0;
+ }
+ }
+ if (nodetype == NODE_CUSP) {
+ double vectorY = _vector[counter - offset][Y];
+ if (_vector.size() <= (unsigned)(counter - offset) || vectorY == 0) {
+ vectorY = 1;
+ }
+ result.push_back(Point(xPos, vectorY));
+ } else {
+ if (_vector[1][X] < 0) {
+ xPos = 0;
+ }
+ result.push_back(Point(floor(xPos), 0));
+ }
+ }
+ ++curve_it1;
+ if (curve_it2 != curve_endit) {
+ ++curve_it2;
+ }
+ counter++;
+ counterCurves++;
+ }
+ counterPaths++;
+ }
+ _vector = result;
+ write_to_SVG();
+ }
+}
+
+void FilletChamferPointArrayParam::recalculate_knots(
+ Piecewise<D2<SBasis> > const &pwd2_in)
+{
+ bool change = false;
+ PathVector pathv = path_from_piecewise(pwd2_in, 0.001);
+ if (!pathv.empty()) {
+ std::vector<Point> result;
+ int counter = 0;
+ int counterCurves = 0;
+ Geom::NodeType nodetype;
+ for (PathVector::const_iterator path_it = pathv.begin();
+ path_it != pathv.end(); ++path_it) {
+ if (path_it->empty()) {
+ counter++;
+ continue;
+ }
+ Geom::Path::const_iterator curve_it1 = path_it->begin();
+ Geom::Path::const_iterator curve_it2 = ++(path_it->begin());
+ Geom::Path::const_iterator curve_endit = path_it->end_default();
+ if (path_it->closed() && path_it->back_closed().isDegenerate()) {
+ const Curve &closingline = path_it->back_closed();
+ if (are_near(closingline.initialPoint(), closingline.finalPoint())) {
+ curve_endit = path_it->end_open();
+ }
+ }
+ counterCurves = 0;
+ while (curve_it1 != curve_endit) {
+ //if start a path get node type
+ if (counterCurves == 0) {
+ if (path_it->closed()) {
+ if (path_it->back_closed().isDegenerate()) {
+ nodetype = get_nodetype(path_it->back_open(), *curve_it1);
+ } else {
+ nodetype = get_nodetype(path_it->back_closed(), *curve_it1);
+ }
+ } else {
+ nodetype = NODE_NONE;
+ }
+ } else {
+ bool this_is_line = true;
+ bool next_is_line = is_straight_curve(*curve_it1);
+ this_is_line = is_straight_curve((*path_it)[counterCurves - 1]);
+ nodetype = get_nodetype((*path_it)[counterCurves - 1], *curve_it1);
+ if (this_is_line || next_is_line) {
+ nodetype = NODE_CUSP;
+ }
+ }
+ if (nodetype == NODE_CUSP) {
+ double vectorY = _vector[counter][Y];
+ if (vectorY == 0) {
+ vectorY = 1;
+ change = true;
+ }
+ result.push_back(Point(_vector[counter][X], vectorY));
+ } else {
+ double xPos = floor(_vector[counter][X]);
+ if (_vector[1][X] < 0) {
+ xPos = 0;
+ }
+ double vectorY = _vector[counter][Y];
+ if (vectorY != 0) {
+ change = true;
+ }
+ result.push_back(Point(xPos, 0));
+ }
+ ++curve_it1;
+ counter++;
+ if (curve_it2 != curve_endit) {
+ ++curve_it2;
+ }
+ counterCurves++;
+ }
+ }
+ if (change) {
+ _vector = result;
+ write_to_SVG();
+ }
+ }
+}
+
+void FilletChamferPointArrayParam::set_pwd2(
+ Piecewise<D2<SBasis> > const &pwd2_in,
+ Piecewise<D2<SBasis> > const &pwd2_normal_in)
+{
+ last_pwd2 = pwd2_in;
+ last_pwd2_normal = pwd2_normal_in;
+}
+
+void FilletChamferPointArrayParam::set_helper_size(int hs)
+{
+ helper_size = hs;
+}
+
+void FilletChamferPointArrayParam::set_use_distance(bool use_knot_distance )
+{
+ use_distance = use_knot_distance;
+}
+
+void FilletChamferPointArrayParam::set_unit(const gchar *abbr)
+{
+ unit = abbr;
+}
+
+void FilletChamferPointArrayParam::updateCanvasIndicators()
+{
+ std::vector<Point> ts = data();
+ hp.clear();
+ unsigned int i = 0;
+ for (std::vector<Point>::const_iterator point_it = ts.begin();
+ point_it != ts.end(); ++point_it) {
+ double Xvalue = to_time(i, (*point_it)[X]) -i;
+ if (Xvalue == 0) {
+ i++;
+ continue;
+ }
+ Geom::Point ptA = last_pwd2[i].valueAt(Xvalue);
+ Geom::Point derivA = unit_vector(derivative(last_pwd2[i]).valueAt(Xvalue));
+ Geom::Rotate rot(Geom::Rotate::from_degrees(-90));
+ derivA = derivA * rot;
+ Geom::Point C = ptA - derivA * helper_size;
+ Geom::Point D = ptA + derivA * helper_size;
+ Geom::Ray ray1(C, D);
+ char const * svgd = "M 1,0.25 0.5,0 1,-0.25 M 1,0.5 0,0 1,-0.5";
+ Geom::PathVector pathv = sp_svg_read_pathv(svgd);
+ Geom::Affine aff = Geom::Affine();
+ aff *= Geom::Scale(helper_size);
+ aff *= Geom::Rotate(ray1.angle() - deg_to_rad(270));
+ pathv *= aff;
+ pathv += last_pwd2[i].valueAt(Xvalue);
+ hp.push_back(pathv[0]);
+ hp.push_back(pathv[1]);
+ i++;
+ }
+}
+
+void FilletChamferPointArrayParam::addCanvasIndicators(
+ SPLPEItem const */*lpeitem*/, std::vector<Geom::PathVector> &hp_vec)
+{
+ hp_vec.push_back(hp);
+}
+
+double FilletChamferPointArrayParam::rad_to_len(int index, double rad)
+{
+ double len = 0;
+ std::vector<Geom::Path> subpaths = path_from_piecewise(last_pwd2, 0.1);
+ std::pair<std::size_t, std::size_t> positions = get_positions(index, subpaths);
+ D2<SBasis> A = last_pwd2[last_index(index, subpaths)];
+ if(positions.second != 0){
+ A = last_pwd2[index-1];
+ }else{
+ if(!subpaths[positions.first].closed()){
+ return len;
+ }
+ }
+ D2<SBasis> B = last_pwd2[index];
+ Piecewise<D2<SBasis> > offset_curve0 = Piecewise<D2<SBasis> >(A)+rot90(unitVector(derivative(A)))*(rad);
+ Piecewise<D2<SBasis> > offset_curve1 = Piecewise<D2<SBasis> >(B)+rot90(unitVector(derivative(B)))*(rad);
+ Geom::Path p0 = path_from_piecewise(offset_curve0, 0.1)[0];
+ Geom::Path p1 = path_from_piecewise(offset_curve1, 0.1)[0];
+ Geom::Crossings cs = Geom::crossings(p0, p1);
+ if(cs.size() > 0){
+ Point cp =p0(cs[0].ta);
+ double p0pt = nearest_point(cp, B);
+ len = time_to_len(index,p0pt);
+ } else {
+ if(rad < 0){
+ len = rad_to_len(index, rad * -1);
+ }
+ }
+ return len;
+}
+
+double FilletChamferPointArrayParam::len_to_rad(int index, double len)
+{
+ double rad = 0;
+ double tmp_len = _vector[index][X];
+ _vector[index] = Geom::Point(len,_vector[index][Y]);
+ std::vector<Geom::Path> subpaths = path_from_piecewise(last_pwd2, 0.1);
+ std::pair<std::size_t, std::size_t> positions = get_positions(index, subpaths);
+ Piecewise<D2<SBasis> > u;
+ u.push_cut(0);
+ u.push(last_pwd2[last_index(index, subpaths)], 1);
+ Geom::Curve * A = path_from_piecewise(u, 0.1)[0][0].duplicate();
+ Geom::Curve * B = subpaths[positions.first][positions.second].duplicate();
+ std::vector<double> times;
+ if(positions.second != 0){
+ A = subpaths[positions.first][positions.second-1].duplicate();
+ times = get_times(index-1, subpaths, false);
+ }else{
+ if(!subpaths[positions.first].closed()){
+ return rad;
+ }
+ times = get_times(last_index(index, subpaths), subpaths, true);
+ }
+ _vector[index] = Geom::Point(tmp_len,_vector[index][Y]);
+ Geom::Point startArcPoint = A->toSBasis().valueAt(times[1]);
+ Geom::Point endArcPoint = B->toSBasis().valueAt(times[2]);
+ Curve *knotCurve1 = A->portion(times[0], times[1]);
+ Curve *knotCurve2 = B->portion(times[2], 1);
+ Geom::CubicBezier const *cubic1 = dynamic_cast<Geom::CubicBezier const *>(&*knotCurve1);
+ Ray ray1(startArcPoint, A->finalPoint());
+ if (cubic1) {
+ ray1.setPoints((*cubic1)[2], startArcPoint);
+ }
+ Geom::CubicBezier const *cubic2 = dynamic_cast<Geom::CubicBezier const *>(&*knotCurve2);
+ Ray ray2(B->initialPoint(), endArcPoint);
+ if (cubic2) {
+ ray2.setPoints(endArcPoint, (*cubic2)[1]);
+ }
+ bool ccwToggle = cross(A->finalPoint() - startArcPoint, endArcPoint - startArcPoint) < 0;
+ double distanceArc = Geom::distance(startArcPoint,middle_point(startArcPoint,endArcPoint));
+ double angleBetween = angle_between(ray1, ray2, ccwToggle);
+ rad = distanceArc/sin(angleBetween/2.0);
+ return rad * -1;
+}
+
+std::vector<double> FilletChamferPointArrayParam::get_times(int index, std::vector<Geom::Path> subpaths, bool last)
+{
+ const double tolerance = 0.001;
+ const double gapHelper = 0.00001;
+ std::pair<std::size_t, std::size_t> positions = get_positions(index, subpaths);
+ Curve *curve_it1;
+ curve_it1 = subpaths[positions.first][positions.second].duplicate();
+ Coord it1_length = (*curve_it1).length(tolerance);
+ double time_it1, time_it2, time_it1_B, intpart;
+ time_it1 = modf(to_time(index, _vector[index][X]), &intpart);
+ if (_vector[index][Y] == 0) {
+ time_it1 = 0;
+ }
+ double resultLenght = 0;
+ time_it1_B = 1;
+ if (subpaths[positions.first].closed() && last) {
+ time_it2 = modf(to_time(index - positions.second , _vector[index - positions.second ][X]), &intpart);
+ resultLenght = it1_length + to_len(index - positions.second, _vector[index - positions.second ][X]);
+ } else if (!subpaths[positions.first].closed() && last){
+ time_it2 = 0;
+ resultLenght = 0;
+ } else {
+ time_it2 = modf(to_time(index + 1, _vector[index + 1][X]), &intpart);
+ resultLenght = it1_length + to_len( index + 1, _vector[index + 1][X]);
+ }
+ if (resultLenght > 0 && time_it2 != 0) {
+ time_it1_B = modf(to_time(index, -resultLenght), &intpart);
+ } else {
+ if (time_it2 == 0) {
+ time_it1_B = 1;
+ } else {
+ time_it1_B = gapHelper;
+ }
+ }
+
+ if ((subpaths[positions.first].closed() && last && _vector[index - positions.second][Y] == 0) || (subpaths[positions.first].size() > positions.second + 1 && _vector[index + 1][Y] == 0)) {
+ time_it1_B = 1;
+ time_it2 = 0;
+ }
+ if (time_it1_B < time_it1) {
+ time_it1_B = time_it1 + gapHelper;
+ }
+ std::vector<double> out;
+ out.push_back(time_it1);
+ out.push_back(time_it1_B);
+ out.push_back(time_it2);
+ return out;
+}
+
+std::pair<std::size_t, std::size_t> FilletChamferPointArrayParam::get_positions(int index, std::vector<Geom::Path> subpaths)
+{
+ int counter = -1;
+ std::size_t first = 0;
+ std::size_t second = 0;
+ for (PathVector::const_iterator path_it = subpaths.begin(); path_it != subpaths.end(); ++path_it) {
+ if (path_it->empty())
+ continue;
+ Geom::Path::const_iterator curve_it1 = path_it->begin();
+ Geom::Path::const_iterator curve_endit = path_it->end_default();
+ if (path_it->closed()) {
+ const Geom::Curve &closingline = path_it->back_closed();
+ // the closing line segment is always of type
+ // Geom::LineSegment.
+ if (are_near(closingline.initialPoint(), closingline.finalPoint())) {
+ // closingline.isDegenerate() did not work, because it only checks for
+ // *exact* zero length, which goes wrong for relative coordinates and
+ // rounding errors...
+ // the closing line segment has zero-length. So stop before that one!
+ curve_endit = path_it->end_open();
+ }
+ }
+ first++;
+ second = 0;
+ while (curve_it1 != curve_endit) {
+ counter++;
+ second++;
+ if(counter == index){
+ break;
+ }
+ ++curve_it1;
+ }
+ if(counter == index){
+ break;
+ }
+ }
+ first--;
+ second--;
+ std::pair<std::size_t, std::size_t> out(first, second);
+ return out;
+}
+
+int FilletChamferPointArrayParam::last_index(int index, std::vector<Geom::Path> subpaths)
+{
+ int counter = -1;
+ bool inSubpath = false;
+ for (PathVector::const_iterator path_it = subpaths.begin(); path_it != subpaths.end(); ++path_it) {
+ if (path_it->empty())
+ continue;
+ Geom::Path::const_iterator curve_it1 = path_it->begin();
+ Geom::Path::const_iterator curve_endit = path_it->end_default();
+ if (path_it->closed()) {
+ const Geom::Curve &closingline = path_it->back_closed();
+ if (are_near(closingline.initialPoint(), closingline.finalPoint())) {
+ curve_endit = path_it->end_open();
+ }
+ }
+ while (curve_it1 != curve_endit) {
+ counter++;
+ if(counter == index){
+ inSubpath = true;
+ }
+ ++curve_it1;
+ }
+ if(inSubpath){
+ break;
+ }
+ }
+ if(!inSubpath){
+ counter = -1;
+ }
+ return counter;
+}
+
+
+double FilletChamferPointArrayParam::len_to_time(int index, double len)
+{
+ double t = 0;
+ if (last_pwd2.size() > (unsigned) index) {
+ if (len != 0) {
+ if (last_pwd2[index][0].degreesOfFreedom() != 2) {
+ Piecewise<D2<SBasis> > u;
+ u.push_cut(0);
+ u.push(last_pwd2[index], 1);
+ std::vector<double> t_roots = roots(arcLengthSb(u) - std::abs(len));
+ if (t_roots.size() > 0) {
+ t = t_roots[0];
+ }
+ } else {
+ double lenghtPart = 0;
+ if (last_pwd2.size() > (unsigned) index) {
+ lenghtPart = length(last_pwd2[index], EPSILON);
+ }
+ if (std::abs(len) < lenghtPart && lenghtPart != 0) {
+ t = std::abs(len) / lenghtPart;
+ }
+ }
+ }
+ t = double(index) + t;
+ } else {
+ t = double(last_pwd2.size() - 1);
+ }
+
+ return t;
+}
+
+double FilletChamferPointArrayParam::time_to_len(int index, double time)
+{
+ double intpart;
+ double len = 0;
+ time = modf(time, &intpart);
+ double lenghtPart = 0;
+ if (last_pwd2.size() <= (unsigned) index || time == 0) {
+ return len;
+ }
+ if (last_pwd2[index][0].degreesOfFreedom() != 2) {
+ Piecewise<D2<SBasis> > u;
+ u.push_cut(0);
+ u.push(last_pwd2[index], 1);
+ u = portion(u, 0, time);
+ return length(u, 0.001) * -1;
+ }
+ lenghtPart = length(last_pwd2[index], EPSILON);
+ return (time * lenghtPart) * -1;
+}
+
+double FilletChamferPointArrayParam::to_time(int index, double A)
+{
+ if (A > 0) {
+ return A;
+ } else {
+ return len_to_time(index, A);
+ }
+}
+
+double FilletChamferPointArrayParam::to_len(int index, double A)
+{
+ if (A > 0) {
+ return time_to_len(index, A);
+ } else {
+ return A;
+ }
+}
+
+void FilletChamferPointArrayParam::set_oncanvas_looks(SPKnotShapeType shape,
+ SPKnotModeType mode,
+ guint32 color)
+{
+ knot_shape = shape;
+ knot_mode = mode;
+ knot_color = color;
+}
+/*
+class FilletChamferPointArrayParamKnotHolderEntity : public KnotHolderEntity {
+public:
+ FilletChamferPointArrayParamKnotHolderEntity(FilletChamferPointArrayParam
+*p, unsigned int index);
+ virtual ~FilletChamferPointArrayParamKnotHolderEntity() {}
+
+ virtual void knot_set(Point const &p, Point const &origin, guint state);
+ virtual Point knot_get() const;
+ virtual void knot_click(guint state);
+ virtual void knot_doubleclicked(guint state);
+
+ /Checks whether the index falls within the size of the parameter's vector/
+ bool valid_index(unsigned int index) const {
+ return (_pparam->_vector.size() > index);
+ };
+
+private:
+ FilletChamferPointArrayParam *_pparam;
+ unsigned int _index;
+};
+/*/
+
+FilletChamferPointArrayParamKnotHolderEntity::
+FilletChamferPointArrayParamKnotHolderEntity(
+ FilletChamferPointArrayParam *p, unsigned int index)
+ : _pparam(p), _index(index) {}
+
+void FilletChamferPointArrayParamKnotHolderEntity::knot_set(Point const &p,
+ Point const &origin,
+ guint state)
+{
+ using namespace Geom;
+
+ if (!valid_index(_index)) {
+ return;
+ }
+ /// @todo how about item transforms???
+ Piecewise<D2<SBasis> > const &pwd2 = _pparam->get_pwd2();
+ //todo: add snapping
+ //Geom::Point const s = snap_knot_position(p, state);
+ double t = nearest_point(p, pwd2[_index]);
+ if (t == 1) {
+ t = 0.9999;
+ }
+ t += _index;
+
+ if (_pparam->_vector.at(_index)[X] <= 0) {
+ _pparam->_vector.at(_index) =
+ Point(_pparam->time_to_len(_index, t), _pparam->_vector.at(_index)[Y]);
+ } else {
+ _pparam->_vector.at(_index) = Point(t, _pparam->_vector.at(_index)[Y]);
+ }
+ sp_lpe_item_update_patheffect(SP_LPE_ITEM(item), false, false);
+}
+
+Point FilletChamferPointArrayParamKnotHolderEntity::knot_get() const
+{
+ using namespace Geom;
+
+ if (!valid_index(_index)) {
+ return Point(infinity(), infinity());
+ }
+
+ Piecewise<D2<SBasis> > const &pwd2 = _pparam->get_pwd2();
+
+ double time_it = _pparam->to_time(_index, _pparam->_vector.at(_index)[X]);
+ Point canvas_point = pwd2.valueAt(time_it);
+
+ _pparam->updateCanvasIndicators();
+ return canvas_point;
+
+}
+
+void FilletChamferPointArrayParamKnotHolderEntity::knot_click(guint state)
+{
+ if (state & GDK_CONTROL_MASK) {
+ if (state & GDK_MOD1_MASK) {
+ _pparam->_vector.at(_index) = Point(_index, _pparam->_vector.at(_index)[Y]);
+ _pparam->param_set_and_write_new_value(_pparam->_vector);
+ sp_lpe_item_update_patheffect(SP_LPE_ITEM(item), false, false);
+ }else{
+ using namespace Geom;
+ double type = _pparam->_vector.at(_index)[Y] + 1;
+ if (type > 4) {
+ type = 1;
+ }
+ _pparam->_vector.at(_index) = Point(_pparam->_vector.at(_index)[X], type);
+ _pparam->param_set_and_write_new_value(_pparam->_vector);
+ sp_lpe_item_update_patheffect(SP_LPE_ITEM(item), false, false);
+ const gchar *tip;
+ if (type == 3) {
+ tip = _("<b>Chamfer</b>: <b>Ctrl+Click</b> toogle type, "
+ "<b>Shift+Click</b> open dialog, "
+ "<b>Ctrl+Alt+Click</b> reset");
+ } else if (type == 2) {
+ tip = _("<b>Inverse Fillet</b>: <b>Ctrl+Click</b> toogle type, "
+ "<b>Shift+Click</b> open dialog, "
+ "<b>Ctrl+Alt+Click</b> reset");
+ } else if (type == 1) {
+ tip = _("<b>Fillet</b>: <b>Ctrl+Click</b> toogle type, "
+ "<b>Shift+Click</b> open dialog, "
+ "<b>Ctrl+Alt+Click</b> reset");
+ } else {
+ tip = _("<b>Double Chamfer</b>: <b>Ctrl+Click</b> toogle type, "
+ "<b>Shift+Click</b> open dialog, "
+ "<b>Ctrl+Alt+Click</b> reset");
+ }
+ this->knot->tip = g_strdup(tip);
+ this->knot->show();
+ }
+ } else if (state & GDK_SHIFT_MASK) {
+ double xModified = _pparam->_vector.at(_index).x();
+ if(xModified < 0 && !_pparam->use_distance){
+ xModified = _pparam->len_to_rad(_index, _pparam->_vector.at(_index).x());
+ }
+ std::vector<Geom::Path> subpaths = path_from_piecewise(_pparam->last_pwd2, 0.1);
+ std::pair<std::size_t, std::size_t> positions = _pparam->get_positions(_index, subpaths);
+ D2<SBasis> A = _pparam->last_pwd2[_pparam->last_index(_index, subpaths)];
+ if(positions.second != 0){
+ A = _pparam->last_pwd2[_index-1];
+ }
+ D2<SBasis> B = _pparam->last_pwd2[_index];
+ bool aprox = (A[0].degreesOfFreedom() != 2 || B[0].degreesOfFreedom() != 2) && !_pparam->use_distance?true:false;
+ Geom::Point offset = Geom::Point(xModified, _pparam->_vector.at(_index).y());
+ Inkscape::UI::Dialogs::FilletChamferPropertiesDialog::showDialog(
+ this->desktop, offset, this, _pparam->unit, _pparam->use_distance, aprox);
+ }
+
+}
+
+void FilletChamferPointArrayParamKnotHolderEntity::knot_set_offset(
+ Geom::Point offset)
+{
+ double xModified = offset.x();
+ if(xModified < 0 && !_pparam->use_distance){
+ xModified = _pparam->rad_to_len(_index, offset.x());
+ }
+ _pparam->_vector.at(_index) = Geom::Point(xModified, offset.y());
+ this->parent_holder->knot_ungrabbed_handler(this->knot, 0);
+}
+
+void FilletChamferPointArrayParam::addKnotHolderEntities(KnotHolder *knotholder,
+ SPDesktop *desktop,
+ SPItem *item)
+{
+ recalculate_knots(get_pwd2());
+ for (unsigned int i = 0; i < _vector.size(); ++i) {
+ if (_vector[i][Y] <= 0) {
+ continue;
+ }
+ const gchar *tip;
+ if (_vector[i][Y] == 3) {
+ tip = _("<b>Chamfer</b>: <b>Ctrl+Click</b> toogle type, "
+ "<b>Shift+Click</b> open dialog, "
+ "<b>Ctrl+Alt+Click</b> reset");
+ } else if (_vector[i][Y] == 2) {
+ tip = _("<b>Inverse Fillet</b>: <b>Ctrl+Click</b> toogle type, "
+ "<b>Shift+Click</b> open dialog, "
+ "<b>Ctrl+Alt+Click</b> reset");
+ } else if (_vector[i][Y] == 1) {
+ tip = _("<b>Fillet</b>: <b>Ctrl+Click</b> toogle type, "
+ "<b>Shift+Click</b> open dialog, "
+ "<b>Ctrl+Alt+Click</b> reset");
+ } else {
+ tip = _("<b>Double Chamfer</b>: <b>Ctrl+Click</b> toogle type, "
+ "<b>Shift+Click</b> open dialog, "
+ "<b>Ctrl+Alt+Click</b> reset");
+ }
+ FilletChamferPointArrayParamKnotHolderEntity *e =
+ new FilletChamferPointArrayParamKnotHolderEntity(this, i);
+ e->create(desktop, item, knotholder, Inkscape::CTRL_TYPE_UNKNOWN, _(tip),
+ knot_shape, knot_mode, knot_color);
+ knotholder->add(e);
+ }
+ updateCanvasIndicators();
+}
+
+} /* namespace LivePathEffect */
+
+} /* namespace Inkscape */
+
+/*
+ Local Variables:
+ mode:c++
+ c-file-style:"stroustrup"
+ c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
+ indent-tabs-mode:nil
+ fill-column:99
+ End:
+*/
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4 :
diff --git a/src/live_effects/parameter/filletchamferpointarray.h b/src/live_effects/parameter/filletchamferpointarray.h
new file mode 100644
index 000000000..a1fa698ae
--- /dev/null
+++ b/src/live_effects/parameter/filletchamferpointarray.h
@@ -0,0 +1,123 @@
+#ifndef INKSCAPE_LIVEPATHEFFECT_FILLET_CHAMFER_POINT_ARRAY_H
+#define INKSCAPE_LIVEPATHEFFECT_FILLET_CHAMFER_POINT_ARRAY_H
+
+/*
+ * Inkscape::LivePathEffectParameters
+ * Copyright (C) Jabiertxo Arraiza Cenoz <jabier.arraiza@marker.es>
+ * Special thanks to Johan Engelen for the base of the effect -powerstroke-
+ * Also to ScislaC for point me to the idea
+ * Also su_v for his construvtive feedback and time
+ * and finaly to Liam P. White for his big help on coding, that save me a lot of
+ * hours
+ * Released under GNU GPL, read the file 'COPYING' for more information
+ */
+
+#include <glib.h>
+#include <2geom/point.h>
+
+#include "live_effects/parameter/array.h"
+
+#include "knot-holder-entity.h"
+
+namespace Inkscape {
+
+namespace LivePathEffect {
+
+class FilletChamferPointArrayParamKnotHolderEntity;
+
+class FilletChamferPointArrayParam : public ArrayParam<Geom::Point> {
+public:
+ FilletChamferPointArrayParam(const Glib::ustring &label,
+ const Glib::ustring &tip,
+ const Glib::ustring &key,
+ Inkscape::UI::Widget::Registry *wr,
+ Effect *effect);
+ virtual ~FilletChamferPointArrayParam();
+
+ virtual Gtk::Widget *param_newWidget();
+
+ virtual void param_transform_multiply(Geom::Affine const &postmul,
+ bool /*set*/);
+
+ void set_oncanvas_looks(SPKnotShapeType shape, SPKnotModeType mode,
+ guint32 color);
+ virtual double to_time(int index, double A);
+ virtual double to_len(int index, double A);
+ virtual double rad_to_len(int index, double rad);
+ virtual double len_to_rad(int index, double len);
+ virtual double len_to_time(int index, double len);
+ virtual double time_to_len(int index, double time);
+ virtual std::pair<std::size_t, std::size_t> get_positions(int index, std::vector<Geom::Path> subpaths);
+ virtual int last_index(int index, std::vector<Geom::Path> subpaths);
+ std::vector<double> get_times(int index, std::vector<Geom::Path> subpaths, bool last);
+ virtual void set_helper_size(int hs);
+ virtual void set_use_distance(bool use_knot_distance);
+ virtual void set_unit(const gchar *abbr);
+ virtual void addCanvasIndicators(SPLPEItem const *lpeitem,
+ std::vector<Geom::PathVector> &hp_vec);
+ virtual bool providesKnotHolderEntities() const {
+ return true;
+ }
+ virtual void updateCanvasIndicators();
+ virtual void addKnotHolderEntities(KnotHolder *knotholder, SPDesktop *desktop,
+ SPItem *item);
+
+ void set_pwd2(Geom::Piecewise<Geom::D2<Geom::SBasis> > const &pwd2_in,
+ Geom::Piecewise<Geom::D2<Geom::SBasis> > const &pwd2_normal_in);
+ Geom::Piecewise<Geom::D2<Geom::SBasis> > const &get_pwd2() const {
+ return last_pwd2;
+ }
+ Geom::Piecewise<Geom::D2<Geom::SBasis> > const &get_pwd2_normal() const {
+ return last_pwd2_normal;
+ }
+
+ void recalculate_controlpoints_for_new_pwd2(
+ Geom::Piecewise<Geom::D2<Geom::SBasis> > const &pwd2_in);
+ void recalculate_knots(
+ Geom::Piecewise<Geom::D2<Geom::SBasis> > const &pwd2_in);
+ friend class FilletChamferPointArrayParamKnotHolderEntity;
+
+private:
+ FilletChamferPointArrayParam(const FilletChamferPointArrayParam &);
+ FilletChamferPointArrayParam &operator=(const FilletChamferPointArrayParam &);
+
+ SPKnotShapeType knot_shape;
+ SPKnotModeType knot_mode;
+ guint32 knot_color;
+ int helper_size;
+ bool use_distance;
+ const gchar *unit;
+ Geom::PathVector hp;
+
+ Geom::Piecewise<Geom::D2<Geom::SBasis> > last_pwd2;
+ Geom::Piecewise<Geom::D2<Geom::SBasis> > last_pwd2_normal;
+};
+
+class FilletChamferPointArrayParamKnotHolderEntity : public KnotHolderEntity {
+public:
+ FilletChamferPointArrayParamKnotHolderEntity(FilletChamferPointArrayParam *p,
+ unsigned int index);
+ virtual ~FilletChamferPointArrayParamKnotHolderEntity() {}
+
+ virtual void knot_set(Geom::Point const &p, Geom::Point const &origin,
+ guint state);
+ virtual Geom::Point knot_get() const;
+ virtual void knot_click(guint state);
+ virtual void knot_set_offset(Geom::Point offset);
+
+ /*Checks whether the index falls within the size of the parameter's vector*/
+ bool valid_index(unsigned int index) const {
+ return (_pparam->_vector.size() > index);
+ }
+ ;
+
+private:
+ FilletChamferPointArrayParam *_pparam;
+ unsigned int _index;
+};
+
+} //namespace LivePathEffect
+
+} //namespace Inkscape
+
+#endif
diff --git a/src/live_effects/parameter/originalpatharray.cpp b/src/live_effects/parameter/originalpatharray.cpp
new file mode 100644
index 000000000..7706dbdf8
--- /dev/null
+++ b/src/live_effects/parameter/originalpatharray.cpp
@@ -0,0 +1,487 @@
+/*
+ * Copyright (C) Theodore Janeczko 2012 <flutterguy317@gmail.com>
+ *
+ * Released under GNU GPL, read the file 'COPYING' for more information
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#if GLIBMM_DISABLE_DEPRECATED && HAVE_GLIBMM_THREADS_H
+#include <glibmm/threads.h>
+#endif
+
+#include "live_effects/parameter/originalpatharray.h"
+
+#include <gtkmm/widget.h>
+#include <gtkmm/icontheme.h>
+#include <gtkmm/imagemenuitem.h>
+#include <gtkmm/separatormenuitem.h>
+#include <gtkmm/scrolledwindow.h>
+
+#include <glibmm/i18n.h>
+
+#include "inkscape.h"
+#include "icon-size.h"
+#include "widgets/icon.h"
+#include "ui/clipboard.h"
+#include "svg/svg.h"
+#include "svg/stringstream.h"
+#include "originalpath.h"
+#include "uri.h"
+#include "display/curve.h"
+
+#include <2geom/coord.h>
+#include <2geom/point.h>
+#include "sp-shape.h"
+#include "sp-text.h"
+#include "live_effects/effect.h"
+
+#include "verbs.h"
+#include "document-undo.h"
+#include "document.h"
+
+namespace Inkscape {
+
+namespace LivePathEffect {
+
+class OriginalPathArrayParam::ModelColumns : public Gtk::TreeModel::ColumnRecord
+{
+public:
+
+ ModelColumns()
+ {
+ add(_colObject);
+ add(_colLabel);
+ add(_colReverse);
+ }
+ virtual ~ModelColumns() {}
+
+ Gtk::TreeModelColumn<PathAndDirection*> _colObject;
+ Gtk::TreeModelColumn<Glib::ustring> _colLabel;
+ Gtk::TreeModelColumn<bool> _colReverse;
+};
+
+OriginalPathArrayParam::OriginalPathArrayParam( const Glib::ustring& label,
+ const Glib::ustring& tip,
+ const Glib::ustring& key,
+ Inkscape::UI::Widget::Registry* wr,
+ Effect* effect )
+: Parameter(label, tip, key, wr, effect),
+ _vector(),
+ _tree(),
+ _text_renderer(),
+ _toggle_renderer(),
+ _scroller()
+{
+ _model = new ModelColumns();
+ _store = Gtk::TreeStore::create(*_model);
+ _tree.set_model(_store);
+
+ _tree.set_reorderable(true);
+ _tree.enable_model_drag_dest (Gdk::ACTION_MOVE);
+
+ _text_renderer = manage(new Gtk::CellRendererText());
+ int nameColNum = _tree.append_column(_("Name"), *_text_renderer) - 1;
+ _name_column = _tree.get_column(nameColNum);
+ _name_column->add_attribute(_text_renderer->property_text(), _model->_colLabel);
+
+ _tree.set_expander_column( *_tree.get_column(nameColNum) );
+ _tree.set_search_column(_model->_colLabel);
+
+ Gtk::CellRendererToggle * _toggle_renderer = manage(new Gtk::CellRendererToggle());
+ int toggleColNum = _tree.append_column(_("Reverse"), *_toggle_renderer) - 1;
+ Gtk::TreeViewColumn* col = _tree.get_column(toggleColNum);
+ _toggle_renderer->set_activatable(true);
+ _toggle_renderer->signal_toggled().connect(sigc::mem_fun(*this, &OriginalPathArrayParam::on_reverse_toggled));
+ col->add_attribute(_toggle_renderer->property_active(), _model->_colReverse);
+
+ //quick little hack -- newer versions of gtk gave the item zero space allotment
+ _scroller.set_size_request(-1, 120);
+
+ _scroller.add(_tree);
+ _scroller.set_policy( Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC );
+ //_scroller.set_shadow_type(Gtk::SHADOW_IN);
+
+ oncanvas_editable = true;
+
+}
+
+OriginalPathArrayParam::~OriginalPathArrayParam()
+{
+ while (!_vector.empty()) {
+ PathAndDirection *w = _vector.back();
+ _vector.pop_back();
+ unlink(w);
+ delete w;
+ }
+ delete _model;
+}
+
+void OriginalPathArrayParam::on_reverse_toggled(const Glib::ustring& path)
+{
+ Gtk::TreeModel::iterator iter = _store->get_iter(path);
+ Gtk::TreeModel::Row row = *iter;
+ PathAndDirection *w = row[_model->_colObject];
+ row[_model->_colReverse] = !row[_model->_colReverse];
+ w->reversed = row[_model->_colReverse];
+
+ gchar * full = param_getSVGValue();
+ param_write_to_repr(full);
+ g_free(full);
+ DocumentUndo::done(param_effect->getSPDoc(), SP_VERB_DIALOG_LIVE_PATH_EFFECT,
+ _("Link path parameter to path"));
+}
+
+void OriginalPathArrayParam::param_set_default()
+{
+
+}
+
+Gtk::Widget* OriginalPathArrayParam::param_newWidget()
+{
+ Gtk::VBox* vbox = Gtk::manage(new Gtk::VBox());
+ Gtk::HBox* hbox = Gtk::manage(new Gtk::HBox());
+
+ vbox->pack_start(_scroller, Gtk::PACK_EXPAND_WIDGET);
+
+
+ { // Paste path to link button
+ Gtk::Widget *pIcon = Gtk::manage( sp_icon_get_icon( GTK_STOCK_PASTE, Inkscape::ICON_SIZE_BUTTON) );
+ Gtk::Button *pButton = Gtk::manage(new Gtk::Button());
+ pButton->set_relief(Gtk::RELIEF_NONE);
+ pIcon->show();
+ pButton->add(*pIcon);
+ pButton->show();
+ pButton->signal_clicked().connect(sigc::mem_fun(*this, &OriginalPathArrayParam::on_link_button_click));
+ hbox->pack_start(*pButton, Gtk::PACK_SHRINK);
+ pButton->set_tooltip_text(_("Link to path"));
+ }
+
+ { // Remove linked path
+ Gtk::Widget *pIcon = Gtk::manage( sp_icon_get_icon( GTK_STOCK_REMOVE, Inkscape::ICON_SIZE_BUTTON) );
+ Gtk::Button *pButton = Gtk::manage(new Gtk::Button());
+ pButton->set_relief(Gtk::RELIEF_NONE);
+ pIcon->show();
+ pButton->add(*pIcon);
+ pButton->show();
+ pButton->signal_clicked().connect(sigc::mem_fun(*this, &OriginalPathArrayParam::on_remove_button_click));
+ hbox->pack_start(*pButton, Gtk::PACK_SHRINK);
+ pButton->set_tooltip_text(_("Remove Path"));
+ }
+
+ { // Move Down
+ Gtk::Widget *pIcon = Gtk::manage( sp_icon_get_icon( GTK_STOCK_GO_DOWN, Inkscape::ICON_SIZE_BUTTON) );
+ Gtk::Button *pButton = Gtk::manage(new Gtk::Button());
+ pButton->set_relief(Gtk::RELIEF_NONE);
+ pIcon->show();
+ pButton->add(*pIcon);
+ pButton->show();
+ pButton->signal_clicked().connect(sigc::mem_fun(*this, &OriginalPathArrayParam::on_down_button_click));
+ hbox->pack_end(*pButton, Gtk::PACK_SHRINK);
+ pButton->set_tooltip_text(_("Move Down"));
+ }
+
+ { // Move Down
+ Gtk::Widget *pIcon = Gtk::manage( sp_icon_get_icon( GTK_STOCK_GO_UP, Inkscape::ICON_SIZE_BUTTON) );
+ Gtk::Button *pButton = Gtk::manage(new Gtk::Button());
+ pButton->set_relief(Gtk::RELIEF_NONE);
+ pIcon->show();
+ pButton->add(*pIcon);
+ pButton->show();
+ pButton->signal_clicked().connect(sigc::mem_fun(*this, &OriginalPathArrayParam::on_up_button_click));
+ hbox->pack_end(*pButton, Gtk::PACK_SHRINK);
+ pButton->set_tooltip_text(_("Move Up"));
+ }
+
+ vbox->pack_end(*hbox, Gtk::PACK_SHRINK);
+
+ vbox->show_all_children(true);
+
+ return vbox;
+}
+
+bool OriginalPathArrayParam::_selectIndex(const Gtk::TreeIter& iter, int* i)
+{
+ if ((*i)-- <= 0) {
+ _tree.get_selection()->select(iter);
+ return true;
+ }
+ return false;
+}
+
+void OriginalPathArrayParam::on_up_button_click()
+{
+ Gtk::TreeModel::iterator iter = _tree.get_selection()->get_selected();
+ if (iter) {
+ Gtk::TreeModel::Row row = *iter;
+
+ int i = -1;
+ std::vector<PathAndDirection*>::iterator piter = _vector.begin();
+ for (std::vector<PathAndDirection*>::iterator iter = _vector.begin(); iter != _vector.end(); piter = iter, i++, iter++) {
+ if (*iter == row[_model->_colObject]) {
+ _vector.erase(iter);
+ _vector.insert(piter, row[_model->_colObject]);
+ break;
+ }
+ }
+
+ gchar * full = param_getSVGValue();
+ param_write_to_repr(full);
+ g_free(full);
+
+ DocumentUndo::done(param_effect->getSPDoc(), SP_VERB_DIALOG_LIVE_PATH_EFFECT,
+ _("Move path up"));
+
+ _store->foreach_iter(sigc::bind<int*>(sigc::mem_fun(*this, &OriginalPathArrayParam::_selectIndex), &i));
+ }
+}
+
+void OriginalPathArrayParam::on_down_button_click()
+{
+ Gtk::TreeModel::iterator iter = _tree.get_selection()->get_selected();
+ if (iter) {
+ Gtk::TreeModel::Row row = *iter;
+
+ int i = 0;
+ for (std::vector<PathAndDirection*>::iterator iter = _vector.begin(); iter != _vector.end(); i++, iter++) {
+ if (*iter == row[_model->_colObject]) {
+ std::vector<PathAndDirection*>::iterator niter = _vector.erase(iter);
+ if (niter != _vector.end()) {
+ niter++;
+ i++;
+ }
+ _vector.insert(niter, row[_model->_colObject]);
+ break;
+ }
+ }
+
+ gchar * full = param_getSVGValue();
+ param_write_to_repr(full);
+ g_free(full);
+
+ DocumentUndo::done(param_effect->getSPDoc(), SP_VERB_DIALOG_LIVE_PATH_EFFECT,
+ _("Move path down"));
+
+ _store->foreach_iter(sigc::bind<int*>(sigc::mem_fun(*this, &OriginalPathArrayParam::_selectIndex), &i));
+ }
+}
+
+void OriginalPathArrayParam::on_remove_button_click()
+{
+ Gtk::TreeModel::iterator iter = _tree.get_selection()->get_selected();
+ if (iter) {
+ Gtk::TreeModel::Row row = *iter;
+ remove_link(row[_model->_colObject]);
+
+ gchar * full = param_getSVGValue();
+ param_write_to_repr(full);
+ g_free(full);
+
+ DocumentUndo::done(param_effect->getSPDoc(), SP_VERB_DIALOG_LIVE_PATH_EFFECT,
+ _("Remove path"));
+ }
+
+}
+
+void
+OriginalPathArrayParam::on_link_button_click()
+{
+ Inkscape::UI::ClipboardManager *cm = Inkscape::UI::ClipboardManager::get();
+ Glib::ustring pathid = cm->getShapeOrTextObjectId(SP_ACTIVE_DESKTOP);
+
+ if (pathid == "") {
+ return;
+ }
+ // add '#' at start to make it an uri.
+ pathid.insert(pathid.begin(), '#');
+
+ Inkscape::SVGOStringStream os;
+ bool foundOne = false;
+ for (std::vector<PathAndDirection*>::const_iterator iter = _vector.begin(); iter != _vector.end(); iter++) {
+ if (foundOne) {
+ os << "|";
+ } else {
+ foundOne = true;
+ }
+ os << (*iter)->href << "," << ((*iter)->reversed ? "1" : "0");
+ }
+
+ if (foundOne) {
+ os << "|";
+ }
+
+ os << pathid.c_str() << ",0";
+
+ param_write_to_repr(os.str().c_str());
+ DocumentUndo::done(param_effect->getSPDoc(), SP_VERB_DIALOG_LIVE_PATH_EFFECT,
+ _("Link path parameter to path"));
+}
+
+void OriginalPathArrayParam::unlink(PathAndDirection* to)
+{
+ to->linked_modified_connection.disconnect();
+ to->linked_delete_connection.disconnect();
+ to->ref.detach();
+ to->_pathvector = Geom::PathVector();
+ if (to->href) {
+ g_free(to->href);
+ to->href = NULL;
+ }
+}
+
+void OriginalPathArrayParam::remove_link(PathAndDirection* to)
+{
+ unlink(to);
+ for (std::vector<PathAndDirection*>::iterator iter = _vector.begin(); iter != _vector.end(); iter++) {
+ if (*iter == to) {
+ PathAndDirection *w = *iter;
+ _vector.erase(iter);
+ delete w;
+ return;
+ }
+ }
+}
+
+void OriginalPathArrayParam::linked_delete(SPObject */*deleted*/, PathAndDirection* /*to*/)
+{
+ //remove_link(to);
+
+ gchar * full = param_getSVGValue();
+ param_write_to_repr(full);
+ g_free(full);
+}
+
+bool OriginalPathArrayParam::_updateLink(const Gtk::TreeIter& iter, PathAndDirection* pd)
+{
+ Gtk::TreeModel::Row row = *iter;
+ if (row[_model->_colObject] == pd) {
+ SPObject *obj = pd->ref.getObject();
+ row[_model->_colLabel] = obj && obj->getId() ? ( obj->label() ? obj->label() : obj->getId() ) : pd->href;
+ return true;
+ }
+ return false;
+}
+
+void OriginalPathArrayParam::linked_changed(SPObject */*old_obj*/, SPObject *new_obj, PathAndDirection* to)
+{
+ to->linked_delete_connection.disconnect();
+ to->linked_modified_connection.disconnect();
+ to->linked_transformed_connection.disconnect();
+
+ if (new_obj && SP_IS_ITEM(new_obj)) {
+ to->linked_delete_connection = new_obj->connectDelete(sigc::bind<PathAndDirection*>(sigc::mem_fun(*this, &OriginalPathArrayParam::linked_delete), to));
+ to->linked_modified_connection = new_obj->connectModified(sigc::bind<PathAndDirection*>(sigc::mem_fun(*this, &OriginalPathArrayParam::linked_modified), to));
+ to->linked_transformed_connection = SP_ITEM(new_obj)->connectTransformed(sigc::bind<PathAndDirection*>(sigc::mem_fun(*this, &OriginalPathArrayParam::linked_transformed), to));
+
+ linked_modified(new_obj, SP_OBJECT_MODIFIED_FLAG, to);
+ } else {
+ to->_pathvector = Geom::PathVector();
+ SP_OBJECT(param_effect->getLPEObj())->requestModified(SP_OBJECT_MODIFIED_FLAG);
+ _store->foreach_iter(sigc::bind<PathAndDirection*>(sigc::mem_fun(*this, &OriginalPathArrayParam::_updateLink), to));
+ }
+}
+
+void OriginalPathArrayParam::setPathVector(SPObject *linked_obj, guint /*flags*/, PathAndDirection* to)
+{
+ if (!to) {
+ return;
+ }
+ SPCurve *curve = NULL;
+ if (SP_IS_SHAPE(linked_obj)) {
+ curve = SP_SHAPE(linked_obj)->getCurveBeforeLPE();
+ }
+ if (SP_IS_TEXT(linked_obj)) {
+ curve = SP_TEXT(linked_obj)->getNormalizedBpath();
+ }
+
+ if (curve == NULL) {
+ // curve invalid, set empty pathvector
+ to->_pathvector = Geom::PathVector();
+ } else {
+ to->_pathvector = curve->get_pathvector();
+ curve->unref();
+ }
+}
+
+void OriginalPathArrayParam::linked_modified(SPObject *linked_obj, guint flags, PathAndDirection* to)
+{
+ if (!to) {
+ return;
+ }
+ setPathVector(linked_obj, flags, to);
+ SP_OBJECT(param_effect->getLPEObj())->requestModified(SP_OBJECT_MODIFIED_FLAG);
+ _store->foreach_iter(sigc::bind<PathAndDirection*>(sigc::mem_fun(*this, &OriginalPathArrayParam::_updateLink), to));
+}
+
+bool OriginalPathArrayParam::param_readSVGValue(const gchar* strvalue)
+{
+ if (strvalue) {
+ while (!_vector.empty()) {
+ PathAndDirection *w = _vector.back();
+ unlink(w);
+ _vector.pop_back();
+ delete w;
+ }
+ _store->clear();
+
+ gchar ** strarray = g_strsplit(strvalue, "|", 0);
+ for (gchar ** iter = strarray; *iter != NULL; iter++) {
+ if ((*iter)[0] == '#') {
+ gchar ** substrarray = g_strsplit(*iter, ",", 0);
+ PathAndDirection* w = new PathAndDirection((SPObject *)param_effect->getLPEObj());
+ w->href = g_strdup(*substrarray);
+ w->reversed = *(substrarray+1) != NULL && (*(substrarray+1))[0] == '1';
+
+ w->linked_changed_connection = w->ref.changedSignal().connect(sigc::bind<PathAndDirection *>(sigc::mem_fun(*this, &OriginalPathArrayParam::linked_changed), w));
+ w->ref.attach(URI(w->href));
+
+ _vector.push_back(w);
+
+ Gtk::TreeModel::iterator iter = _store->append();
+ Gtk::TreeModel::Row row = *iter;
+ SPObject *obj = w->ref.getObject();
+
+ row[_model->_colObject] = w;
+ row[_model->_colLabel] = obj ? ( obj->label() ? obj->label() : obj->getId() ) : w->href;
+ row[_model->_colReverse] = w->reversed;
+ g_strfreev (substrarray);
+ }
+ }
+ g_strfreev (strarray);
+ return true;
+ }
+ return false;
+}
+
+gchar * OriginalPathArrayParam::param_getSVGValue() const
+{
+ Inkscape::SVGOStringStream os;
+ bool foundOne = false;
+ for (std::vector<PathAndDirection*>::const_iterator iter = _vector.begin(); iter != _vector.end(); iter++) {
+ if (foundOne) {
+ os << "|";
+ } else {
+ foundOne = true;
+ }
+ os << (*iter)->href << "," << ((*iter)->reversed ? "1" : "0");
+ }
+ gchar * str = g_strdup(os.str().c_str());
+ return str;
+}
+
+} /* namespace LivePathEffect */
+
+} /* namespace Inkscape */
+
+/*
+ Local Variables:
+ mode:c++
+ c-file-style:"stroustrup"
+ c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
+ indent-tabs-mode:nil
+ fill-column:99
+ End:
+*/
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4 :
diff --git a/src/live_effects/parameter/originalpatharray.h b/src/live_effects/parameter/originalpatharray.h
new file mode 100644
index 000000000..6c792613f
--- /dev/null
+++ b/src/live_effects/parameter/originalpatharray.h
@@ -0,0 +1,122 @@
+#ifndef INKSCAPE_LIVEPATHEFFECT_PARAMETER_ORIGINALPATHARRAY_H
+#define INKSCAPE_LIVEPATHEFFECT_PARAMETER_ORIGINALPATHARRAY_H
+
+/*
+ * Inkscape::LivePathEffectParameters
+ *
+ * Copyright (C) Theodore Janeczko 2012 <flutterguy317@gmail.com>
+ *
+ * Released under GNU GPL, read the file 'COPYING' for more information
+ */
+
+#include <vector>
+
+#include <gtkmm/box.h>
+#include <gtkmm/treeview.h>
+#include <gtkmm/treestore.h>
+#include <gtkmm/scrolledwindow.h>
+
+#include "live_effects/parameter/parameter.h"
+#include "live_effects/parameter/path-reference.h"
+
+#include "svg/svg.h"
+#include "svg/stringstream.h"
+#include "path-reference.h"
+#include "sp-object.h"
+
+namespace Inkscape {
+
+namespace LivePathEffect {
+
+class PathAndDirection {
+public:
+ PathAndDirection(SPObject *owner)
+ : href(NULL),
+ ref(owner),
+ _pathvector(Geom::PathVector()),
+ reversed(false)
+ {
+
+ }
+ gchar *href;
+ URIReference ref;
+ std::vector<Geom::Path> _pathvector;
+ bool reversed;
+
+ sigc::connection linked_changed_connection;
+ sigc::connection linked_delete_connection;
+ sigc::connection linked_modified_connection;
+ sigc::connection linked_transformed_connection;
+};
+
+class OriginalPathArrayParam : public Parameter {
+public:
+ class ModelColumns;
+
+ OriginalPathArrayParam( const Glib::ustring& label,
+ const Glib::ustring& tip,
+ const Glib::ustring& key,
+ Inkscape::UI::Widget::Registry* wr,
+ Effect* effect);
+
+ virtual ~OriginalPathArrayParam();
+
+ virtual Gtk::Widget * param_newWidget();
+ virtual bool param_readSVGValue(const gchar * strvalue);
+ virtual gchar * param_getSVGValue() const;
+ virtual void param_set_default();
+
+ /** Disable the canvas indicators of parent class by overriding this method */
+ virtual void param_editOncanvas(SPItem * /*item*/, SPDesktop * /*dt*/) {};
+ /** Disable the canvas indicators of parent class by overriding this method */
+ virtual void addCanvasIndicators(SPLPEItem const* /*lpeitem*/, std::vector<Geom::PathVector> & /*hp_vec*/) {};
+
+ std::vector<PathAndDirection*> _vector;
+
+protected:
+ bool _updateLink(const Gtk::TreeIter& iter, PathAndDirection* pd);
+ bool _selectIndex(const Gtk::TreeIter& iter, int* i);
+ void unlink(PathAndDirection* to);
+ void remove_link(PathAndDirection* to);
+ void setPathVector(SPObject *linked_obj, guint flags, PathAndDirection* to);
+
+ void linked_changed(SPObject *old_obj, SPObject *new_obj, PathAndDirection* to);
+ void linked_modified(SPObject *linked_obj, guint flags, PathAndDirection* to);
+ void linked_transformed(Geom::Affine const *, SPItem *, PathAndDirection*) {}
+ void linked_delete(SPObject *deleted, PathAndDirection* to);
+
+ ModelColumns *_model;
+ Glib::RefPtr<Gtk::TreeStore> _store;
+ Gtk::TreeView _tree;
+ Gtk::CellRendererText *_text_renderer;
+ Gtk::CellRendererToggle *_toggle_renderer;
+ Gtk::TreeView::Column *_name_column;
+ Gtk::ScrolledWindow _scroller;
+
+ void on_link_button_click();
+ void on_remove_button_click();
+ void on_up_button_click();
+ void on_down_button_click();
+ void on_reverse_toggled(const Glib::ustring& path);
+
+private:
+ OriginalPathArrayParam(const OriginalPathArrayParam&);
+ OriginalPathArrayParam& operator=(const OriginalPathArrayParam&);
+};
+
+} //namespace LivePathEffect
+
+} //namespace Inkscape
+
+#endif
+
+/*
+ Local Variables:
+ mode:c++
+ c-file-style:"stroustrup"
+ c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
+ indent-tabs-mode:nil
+ fill-column:99
+ End:
+*/
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4 :
diff --git a/src/live_effects/parameter/parameter.cpp b/src/live_effects/parameter/parameter.cpp
index ad2960cd9..7a2fd9769 100644
--- a/src/live_effects/parameter/parameter.cpp
+++ b/src/live_effects/parameter/parameter.cpp
@@ -42,6 +42,13 @@ Parameter::param_write_to_repr(const char * svgd)
param_effect->getRepr()->setAttribute(param_key.c_str(), svgd);
}
+// In gtk2, this wasn't an issue; we could toss around
+// G_MAXDOUBLE and not worry about size allocations. But
+// in gtk3, it is an issue: it allocates widget size for the maxmium
+// value you pass to it, leading to some insane lengths.
+// If you need this to be more, please be conservative about it.
+const double SCALARPARAM_G_MAXDOUBLE = 10000000000;
+
void Parameter::write_to_SVG(void)
{
gchar * str = param_getSVGValue();
@@ -57,8 +64,8 @@ ScalarParam::ScalarParam( const Glib::ustring& label, const Glib::ustring& tip,
Effect* effect, gdouble default_value)
: Parameter(label, tip, key, wr, effect),
value(default_value),
- min(-G_MAXDOUBLE),
- max(G_MAXDOUBLE),
+ min(-SCALARPARAM_G_MAXDOUBLE),
+ max(SCALARPARAM_G_MAXDOUBLE),
integer(false),
defvalue(default_value),
digits(2),
@@ -114,8 +121,22 @@ ScalarParam::param_set_value(gdouble val)
void
ScalarParam::param_set_range(gdouble min, gdouble max)
{
- this->min = min;
- this->max = max;
+ // if you look at client code, you'll see that many effects
+ // has a tendency to set an upper range of Geom::infinity().
+ // Once again, in gtk2, this is not a problem. But in gtk3,
+ // widgets get allocated the amount of size they ask for,
+ // leading to excessively long widgets.
+
+ if (min >= -SCALARPARAM_G_MAXDOUBLE) {
+ this->min = min;
+ } else {
+ this->min = -SCALARPARAM_G_MAXDOUBLE;
+ }
+ if (max <= SCALARPARAM_G_MAXDOUBLE) {
+ this->max = max;
+ } else {
+ this->max = SCALARPARAM_G_MAXDOUBLE;
+ }
param_set_value(value); // reset value to see whether it is in ranges
}
diff --git a/src/live_effects/parameter/path.cpp b/src/live_effects/parameter/path.cpp
index 89947034d..2a14d4208 100644
--- a/src/live_effects/parameter/path.cpp
+++ b/src/live_effects/parameter/path.cpp
@@ -28,8 +28,8 @@
#include "document-undo.h"
// needed for on-canvas editting:
-#include "tools-switch.h"
-#include "shape-editor.h"
+#include "ui/tools-switch.h"
+#include "ui/shape-editor.h"
#include "desktop-handles.h"
#include "selection.h"
// clipboard support
diff --git a/src/live_effects/parameter/pointreseteable.cpp b/src/live_effects/parameter/pointreseteable.cpp
new file mode 100644
index 000000000..c0f8858b8
--- /dev/null
+++ b/src/live_effects/parameter/pointreseteable.cpp
@@ -0,0 +1,210 @@
+/*
+ * Copyright (C) Johan Engelen 2007 <j.b.c.engelen@utwente.nl>
+ *
+ * Released under GNU GPL, read the file 'COPYING' for more information
+ */
+
+#include "ui/widget/registered-widget.h"
+#include "live_effects/parameter/pointreseteable.h"
+#include "live_effects/effect.h"
+#include "svg/svg.h"
+#include "svg/stringstream.h"
+#include "ui/widget/point.h"
+#include "widgets/icon.h"
+#include "inkscape.h"
+#include "verbs.h"
+#include "knotholder.h"
+#include <glibmm/i18n.h>
+#include "ui/tools-switch.h"
+#include "ui/tools/node-tool.h"
+
+// needed for on-canvas editting:
+#include "desktop.h"
+
+namespace Inkscape {
+
+namespace LivePathEffect {
+
+PointReseteableParam::PointReseteableParam( const Glib::ustring& label, const Glib::ustring& tip,
+ const Glib::ustring& key, Inkscape::UI::Widget::Registry* wr,
+ Effect* effect, const gchar *htip, Geom::Point default_value)
+ : Geom::Point(default_value), Parameter(label, tip, key, wr, effect), defvalue(default_value)
+{
+ knot_shape = SP_KNOT_SHAPE_DIAMOND;
+ knot_mode = SP_KNOT_MODE_XOR;
+ knot_color = 0xffffff00;
+ handle_tip = g_strdup(htip);
+}
+
+PointReseteableParam::~PointReseteableParam()
+{
+ if (handle_tip)
+ g_free(handle_tip);
+}
+
+void
+PointReseteableParam::param_set_default()
+{
+ param_setValue(defvalue);
+}
+
+void
+PointReseteableParam::param_set_and_write_default()
+{
+ param_set_and_write_new_value(defvalue);
+}
+
+void
+PointReseteableParam::param_update_default(Geom::Point newpoint)
+{
+ this->defvalue = newpoint;
+}
+
+bool
+PointReseteableParam::param_readSVGValue(const gchar * strvalue)
+{
+ gchar ** strarray = g_strsplit(strvalue, ",", 2);
+ double newx, newy;
+ unsigned int success = sp_svg_number_read_d(strarray[0], &newx);
+ success += sp_svg_number_read_d(strarray[1], &newy);
+ g_strfreev (strarray);
+ if (success == 2) {
+ param_setValue( Geom::Point(newx, newy) );
+ return true;
+ }
+ return false;
+}
+
+gchar *
+PointReseteableParam::param_getSVGValue() const
+{
+ Inkscape::SVGOStringStream os;
+ os << *dynamic_cast<Geom::Point const *>( this );
+ gchar * str = g_strdup(os.str().c_str());
+ return str;
+}
+
+Gtk::Widget *
+PointReseteableParam::param_newWidget()
+{
+ Inkscape::UI::Widget::RegisteredTransformedPoint * pointwdg = Gtk::manage(
+ new Inkscape::UI::Widget::RegisteredTransformedPoint( param_label,
+ param_tooltip,
+ param_key,
+ *param_wr,
+ param_effect->getRepr(),
+ param_effect->getSPDoc() ) );
+ // TODO: fix to get correct desktop (don't use SP_ACTIVE_DESKTOP)
+ SPDesktop *desktop = SP_ACTIVE_DESKTOP;
+ Geom::Affine transf = desktop->doc2dt();
+ pointwdg->setTransform(transf);
+ pointwdg->setValue( *this );
+ pointwdg->clearProgrammatically();
+ pointwdg->set_undo_parameters(SP_VERB_DIALOG_LIVE_PATH_EFFECT, _("Change point parameter"));
+
+ Gtk::HBox * hbox = Gtk::manage( new Gtk::HBox() );
+ static_cast<Gtk::HBox*>(hbox)->pack_start(*pointwdg, true, true);
+ static_cast<Gtk::HBox*>(hbox)->show_all_children();
+
+ return dynamic_cast<Gtk::Widget *> (hbox);
+}
+
+void
+PointReseteableParam::param_setValue(Geom::Point newpoint)
+{
+ *dynamic_cast<Geom::Point *>( this ) = newpoint;
+ if(SP_ACTIVE_DESKTOP){
+ SPDesktop* desktop = SP_ACTIVE_DESKTOP;
+ if (tools_isactive( desktop, TOOLS_NODES)) {
+ Inkscape::UI::Tools::NodeTool *nt = static_cast<Inkscape::UI::Tools::NodeTool*>( desktop->event_context);
+ nt->update_helperpath();
+ }
+ }
+}
+
+void
+PointReseteableParam::param_set_and_write_new_value (Geom::Point newpoint)
+{
+ Inkscape::SVGOStringStream os;
+ os << newpoint;
+ gchar * str = g_strdup(os.str().c_str());
+ param_write_to_repr(str);
+ g_free(str);
+}
+
+void
+PointReseteableParam::param_transform_multiply(Geom::Affine const& postmul, bool /*set*/)
+{
+ param_set_and_write_new_value( (*this) * postmul );
+}
+
+
+void
+PointReseteableParam::set_oncanvas_looks(SPKnotShapeType shape, SPKnotModeType mode, guint32 color)
+{
+ knot_shape = shape;
+ knot_mode = mode;
+ knot_color = color;
+}
+
+class PointReseteableParamKnotHolderEntity : public KnotHolderEntity {
+public:
+ PointReseteableParamKnotHolderEntity(PointReseteableParam *p) { this->pparam = p; }
+ virtual ~PointReseteableParamKnotHolderEntity() {}
+
+ virtual void knot_set(Geom::Point const &p, Geom::Point const &origin, guint state);
+ virtual Geom::Point knot_get() const;
+ virtual void knot_click(guint state);
+
+private:
+ PointReseteableParam *pparam;
+};
+
+void
+PointReseteableParamKnotHolderEntity::knot_set(Geom::Point const &p, Geom::Point const &/*origin*/, guint state)
+{
+ Geom::Point const s = snap_knot_position(p, state);
+ pparam->param_setValue(s);
+ sp_lpe_item_update_patheffect(SP_LPE_ITEM(item), false, false);
+}
+
+Geom::Point
+PointReseteableParamKnotHolderEntity::knot_get() const
+{
+ return *pparam;
+}
+
+void
+PointReseteableParamKnotHolderEntity::knot_click(guint state)
+{
+ if (state & GDK_CONTROL_MASK) {
+ if (state & GDK_MOD1_MASK) {
+ this->pparam->param_set_default();
+ sp_lpe_item_update_patheffect(SP_LPE_ITEM(item), false, false);
+ }
+ }
+}
+
+void
+PointReseteableParam::addKnotHolderEntities(KnotHolder *knotholder, SPDesktop *desktop, SPItem *item)
+{
+ PointReseteableParamKnotHolderEntity *e = new PointReseteableParamKnotHolderEntity(this);
+ // TODO: can we ditch handleTip() etc. because we have access to handle_tip etc. itself???
+ e->create(desktop, item, knotholder, Inkscape::CTRL_TYPE_UNKNOWN, handleTip(), knot_shape, knot_mode, knot_color);
+ knotholder->add(e);
+}
+
+} /* namespace LivePathEffect */
+
+} /* namespace Inkscape */
+
+/*
+ Local Variables:
+ mode:c++
+ c-file-style:"stroustrup"
+ c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
+ indent-tabs-mode:nil
+ fill-column:99
+ End:
+*/
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4 :
diff --git a/src/live_effects/parameter/pointreseteable.h b/src/live_effects/parameter/pointreseteable.h
new file mode 100644
index 000000000..5ae1fdf02
--- /dev/null
+++ b/src/live_effects/parameter/pointreseteable.h
@@ -0,0 +1,74 @@
+#ifndef INKSCAPE_LIVEPATHEFFECT_PARAMETER_POINT_RESETEABLE_H
+#define INKSCAPE_LIVEPATHEFFECT_PARAMETER_POINT_RESETEABLE_H
+
+/*
+ * Inkscape::LivePathEffectParameters
+ *
+* Copyright (C) Johan Engelen 2007 <j.b.c.engelen@utwente.nl>
+ *
+ * Released under GNU GPL, read the file 'COPYING' for more information
+ */
+
+#include <glib.h>
+#include <2geom/point.h>
+
+#include "live_effects/parameter/parameter.h"
+
+#include "knot-holder-entity.h"
+
+namespace Inkscape {
+
+namespace LivePathEffect {
+
+class PointReseteableParamKnotHolderEntity;
+
+class PointReseteableParam : public Geom::Point, public Parameter {
+public:
+ PointReseteableParam( const Glib::ustring& label,
+ const Glib::ustring& tip,
+ const Glib::ustring& key,
+ Inkscape::UI::Widget::Registry* wr,
+ Effect* effect,
+ const gchar *handle_tip = NULL,
+ Geom::Point default_value = Geom::Point(0,0) ); // tip for automatically associated on-canvas handle
+ virtual ~PointReseteableParam();
+
+ virtual Gtk::Widget * param_newWidget();
+
+ bool param_readSVGValue(const gchar * strvalue);
+ gchar * param_getSVGValue() const;
+ inline const gchar *handleTip() const { return handle_tip ? handle_tip : param_tooltip.c_str(); }
+
+ void param_setValue(Geom::Point newpoint);
+ void param_set_default();
+ void param_set_and_write_default();
+ void param_update_default(Geom::Point newpoint);
+
+ void param_set_and_write_new_value(Geom::Point newpoint);
+
+ virtual void param_transform_multiply(Geom::Affine const& /*postmul*/, bool /*set*/);
+
+ void set_oncanvas_looks(SPKnotShapeType shape, SPKnotModeType mode, guint32 color);
+
+ virtual bool providesKnotHolderEntities() const { return true; }
+ virtual void addKnotHolderEntities(KnotHolder *knotholder, SPDesktop *desktop, SPItem *item);
+
+ friend class PointReseteableParamKnotHolderEntity;
+private:
+ PointReseteableParam(const PointReseteableParam&);
+ PointReseteableParam& operator=(const PointReseteableParam&);
+
+ Geom::Point defvalue;
+
+ SPKnotShapeType knot_shape;
+ SPKnotModeType knot_mode;
+ guint32 knot_color;
+ gchar *handle_tip;
+};
+
+
+} //namespace LivePathEffect
+
+} //namespace Inkscape
+
+#endif
diff --git a/src/live_effects/parameter/powerstrokepointarray.cpp b/src/live_effects/parameter/powerstrokepointarray.cpp
index 964ab13b0..e0c2f4c68 100644
--- a/src/live_effects/parameter/powerstrokepointarray.cpp
+++ b/src/live_effects/parameter/powerstrokepointarray.cpp
@@ -4,8 +4,7 @@
* Released under GNU GPL, read the file 'COPYING' for more information
*/
-#include <glibmm/i18n.h>
-
+#include "ui/dialog/lpe-powerstroke-properties.h"
#include "live_effects/parameter/powerstrokepointarray.h"
#include "live_effects/effect.h"
@@ -17,6 +16,8 @@
#include "preferences.h" // for proportional stroke/path scaling behavior
+#include <glibmm/i18n.h>
+
namespace Inkscape {
namespace LivePathEffect {
@@ -41,7 +42,6 @@ PowerStrokePointArrayParam::param_newWidget()
return NULL;
}
-
void PowerStrokePointArrayParam::param_transform_multiply(Geom::Affine const &postmul, bool /*set*/)
{
// Check if proportional stroke-width scaling is on
@@ -61,7 +61,6 @@ void PowerStrokePointArrayParam::param_transform_multiply(Geom::Affine const &po
}
}
-
/** call this method to recalculate the controlpoints such that they stay at the same location relative to the new path. Useful after adding/deleting nodes to the path.*/
void
PowerStrokePointArrayParam::recalculate_controlpoints_for_new_pwd2(Geom::Piecewise<Geom::D2<Geom::SBasis> > const & pwd2_in)
@@ -90,6 +89,23 @@ PowerStrokePointArrayParam::recalculate_controlpoints_for_new_pwd2(Geom::Piecewi
}
}
+float PowerStrokePointArrayParam::median_width()
+{
+ size_t size = _vector.size();
+ if (size > 0)
+ {
+ if (size % 2 == 0)
+ {
+ return (_vector[size / 2 - 1].y() + _vector[size / 2].y()) / 2;
+ }
+ else
+ {
+ return _vector[size / 2].y();
+ }
+ }
+ return 1;
+}
+
void
PowerStrokePointArrayParam::set_pwd2(Geom::Piecewise<Geom::D2<Geom::SBasis> > const & pwd2_in, Geom::Piecewise<Geom::D2<Geom::SBasis> > const & pwd2_normal_in)
{
@@ -105,7 +121,7 @@ PowerStrokePointArrayParam::set_oncanvas_looks(SPKnotShapeType shape, SPKnotMode
knot_mode = mode;
knot_color = color;
}
-
+/*
class PowerStrokePointArrayParamKnotHolderEntity : public KnotHolderEntity {
public:
PowerStrokePointArrayParamKnotHolderEntity(PowerStrokePointArrayParam *p, unsigned int index);
@@ -115,7 +131,7 @@ public:
virtual Geom::Point knot_get() const;
virtual void knot_click(guint state);
- /** Checks whether the index falls within the size of the parameter's vector */
+ // Checks whether the index falls within the size of the parameter's vector
bool valid_index(unsigned int index) const {
return (_pparam->_vector.size() > index);
};
@@ -123,7 +139,7 @@ public:
private:
PowerStrokePointArrayParam *_pparam;
unsigned int _index;
-};
+};*/
PowerStrokePointArrayParamKnotHolderEntity::PowerStrokePointArrayParamKnotHolderEntity(PowerStrokePointArrayParam *p, unsigned int index)
: _pparam(p),
@@ -172,6 +188,12 @@ PowerStrokePointArrayParamKnotHolderEntity::knot_get() const
return canvas_point;
}
+void PowerStrokePointArrayParamKnotHolderEntity::knot_set_offset(Geom::Point offset)
+{
+ _pparam->_vector.at(_index) = Geom::Point(offset.x(), offset.y() / 2);
+ this->parent_holder->knot_ungrabbed_handler(this->knot, 0);
+}
+
void
PowerStrokePointArrayParamKnotHolderEntity::knot_click(guint state)
{
@@ -214,10 +236,15 @@ PowerStrokePointArrayParamKnotHolderEntity::knot_click(guint state)
// add knot to knotholder
PowerStrokePointArrayParamKnotHolderEntity *e = new PowerStrokePointArrayParamKnotHolderEntity(_pparam, _index+1);
e->create( this->desktop, this->item, parent_holder, Inkscape::CTRL_TYPE_UNKNOWN,
- _("<b>Stroke width control point</b>: drag to alter the stroke width. <b>Ctrl+click</b> adds a control point, <b>Ctrl+Alt+click</b> deletes it."),
+ _("<b>Stroke width control point</b>: drag to alter the stroke width. <b>Ctrl+click</b> adds a control point, <b>Ctrl+Alt+click</b> deletes it, <b>Shift+click</b> launches width dialog."),
_pparam->knot_shape, _pparam->knot_mode, _pparam->knot_color);
parent_holder->add(e);
}
+ }
+ else if ((state & GDK_MOD1_MASK) || (state & GDK_SHIFT_MASK))
+ {
+ Geom::Point offset = Geom::Point(_pparam->_vector.at(_index).x(), _pparam->_vector.at(_index).y() * 2);
+ Inkscape::UI::Dialogs::PowerstrokePropertiesDialog::showDialog(this->desktop, offset, this);
}
}
@@ -226,7 +253,7 @@ void PowerStrokePointArrayParam::addKnotHolderEntities(KnotHolder *knotholder, S
for (unsigned int i = 0; i < _vector.size(); ++i) {
PowerStrokePointArrayParamKnotHolderEntity *e = new PowerStrokePointArrayParamKnotHolderEntity(this, i);
e->create( desktop, item, knotholder, Inkscape::CTRL_TYPE_UNKNOWN,
- _("<b>Stroke width control point</b>: drag to alter the stroke width. <b>Ctrl+click</b> adds a control point, <b>Ctrl+Alt+click</b> deletes it."),
+ _("<b>Stroke width control point</b>: drag to alter the stroke width. <b>Ctrl+click</b> adds a control point, <b>Ctrl+Alt+click</b> deletes it, <b>Shift+click</b> launches width dialog."),
knot_shape, knot_mode, knot_color);
knotholder->add(e);
}
diff --git a/src/live_effects/parameter/powerstrokepointarray.h b/src/live_effects/parameter/powerstrokepointarray.h
index e1fa440f2..70b22e27e 100644
--- a/src/live_effects/parameter/powerstrokepointarray.h
+++ b/src/live_effects/parameter/powerstrokepointarray.h
@@ -20,8 +20,6 @@ namespace Inkscape {
namespace LivePathEffect {
-class PowerStrokePointArrayParamKnotHolderEntity;
-
class PowerStrokePointArrayParam : public ArrayParam<Geom::Point> {
public:
PowerStrokePointArrayParam( const Glib::ustring& label,
@@ -33,10 +31,12 @@ public:
virtual Gtk::Widget * param_newWidget();
- virtual void param_transform_multiply(Geom::Affine const& /*postmul*/, bool /*set*/);
+ virtual void param_transform_multiply(Geom::Affine const& postmul, bool /*set*/);
void set_oncanvas_looks(SPKnotShapeType shape, SPKnotModeType mode, guint32 color);
+ float median_width();
+
virtual bool providesKnotHolderEntities() const { return true; }
virtual void addKnotHolderEntities(KnotHolder *knotholder, SPDesktop *desktop, SPItem *item);
@@ -60,6 +60,25 @@ private:
Geom::Piecewise<Geom::D2<Geom::SBasis> > last_pwd2_normal;
};
+class PowerStrokePointArrayParamKnotHolderEntity : public KnotHolderEntity {
+public:
+ PowerStrokePointArrayParamKnotHolderEntity(PowerStrokePointArrayParam *p, unsigned int index);
+ virtual ~PowerStrokePointArrayParamKnotHolderEntity() {}
+
+ virtual void knot_set(Geom::Point const &p, Geom::Point const &origin, guint state);
+ virtual Geom::Point knot_get() const;
+ virtual void knot_set_offset(Geom::Point offset);
+ virtual void knot_click(guint state);
+
+ /** Checks whether the index falls within the size of the parameter's vector */
+ bool valid_index(unsigned int index) const {
+ return (_pparam->_vector.size() > index);
+ };
+
+private:
+ PowerStrokePointArrayParam *_pparam;
+ unsigned int _index;
+};
} //namespace LivePathEffect
diff --git a/src/live_effects/parameter/togglebutton.cpp b/src/live_effects/parameter/togglebutton.cpp
new file mode 100644
index 000000000..c5da8b858
--- /dev/null
+++ b/src/live_effects/parameter/togglebutton.cpp
@@ -0,0 +1,172 @@
+/*
+ * Copyright (C) Johan Engelen 2007 <j.b.c.engelen@utwente.nl>
+ * Copyright (C) Jabiertxo Arraiza Cenoz 2014 <j.b.c.engelen@utwente.nl>
+ *
+ * Released under GNU GPL, read the file 'COPYING' for more information
+ */
+
+#include "ui/widget/registered-widget.h"
+#include <glibmm/i18n.h>
+
+#include "live_effects/parameter/togglebutton.h"
+#include "live_effects/effect.h"
+#include "svg/svg.h"
+#include "svg/stringstream.h"
+#include "widgets/icon.h"
+#include "inkscape.h"
+#include "verbs.h"
+#include "helper-fns.h"
+
+namespace Inkscape {
+
+namespace LivePathEffect {
+
+ToggleButtonParam::ToggleButtonParam( const Glib::ustring& label, const Glib::ustring& tip,
+ const Glib::ustring& key, Inkscape::UI::Widget::Registry* wr,
+ Effect* effect, bool default_value, const Glib::ustring& inactive_label,
+ char const * icon_active, char const * icon_inactive,
+ Inkscape::IconSize icon_size)
+ : Parameter(label, tip, key, wr, effect), value(default_value), defvalue(default_value),
+ inactiveLabel(inactive_label), iconActive(icon_active), iconInactive(icon_inactive), iconSize(icon_size)
+{
+ checkwdg = NULL;
+}
+
+ToggleButtonParam::~ToggleButtonParam()
+{
+ if (_toggled_connection.connected()) {
+ _toggled_connection.disconnect();
+ }
+}
+
+void
+ToggleButtonParam::param_set_default()
+{
+ param_setValue(defvalue);
+}
+
+bool
+ToggleButtonParam::param_readSVGValue(const gchar * strvalue)
+{
+ param_setValue(helperfns_read_bool(strvalue, defvalue));
+ return true; // not correct: if value is unacceptable, should return false!
+}
+
+gchar *
+ToggleButtonParam::param_getSVGValue() const
+{
+ gchar * str = g_strdup(value ? "true" : "false");
+ return str;
+}
+
+Gtk::Widget *
+ToggleButtonParam::param_newWidget()
+{
+ if (_toggled_connection.connected()) {
+ _toggled_connection.disconnect();
+ }
+
+ checkwdg = Gtk::manage(
+ new Inkscape::UI::Widget::RegisteredToggleButton( param_label,
+ param_tooltip,
+ param_key,
+ *param_wr,
+ false,
+ param_effect->getRepr(),
+ param_effect->getSPDoc()) );
+#if GTK_CHECK_VERSION(3,0,0)
+ GtkWidget * boxButton = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
+ gtk_box_set_homogeneous(GTK_BOX(boxButton), false);
+#else
+ GtkWidget * boxButton = gtk_hbox_new (false, 0);
+#endif
+ GtkWidget * labelButton = gtk_label_new ("");
+ if (!param_label.empty()) {
+ if(value || inactiveLabel.empty()){
+ gtk_label_set_text(GTK_LABEL(labelButton), param_label.c_str());
+ }else{
+ gtk_label_set_text(GTK_LABEL(labelButton), inactiveLabel.c_str());
+ }
+ }
+ gtk_widget_show(labelButton);
+ if ( iconActive ) {
+ if(!iconInactive){
+ iconInactive = iconActive;
+ }
+ gtk_widget_show(boxButton);
+ GtkWidget *iconButton = sp_icon_new(iconSize, iconActive);
+ if(!value){
+ iconButton = sp_icon_new(iconSize, iconInactive);
+ }
+ gtk_widget_show(iconButton);
+ gtk_box_pack_start (GTK_BOX(boxButton), iconButton, false, false, 1);
+ if (!param_label.empty()) {
+ gtk_box_pack_start (GTK_BOX(boxButton), labelButton, false, false, 1);
+ }
+ }else{
+ gtk_box_pack_start (GTK_BOX(boxButton), labelButton, false, false, 1);
+ }
+ checkwdg->add(*Gtk::manage(Glib::wrap(boxButton)));
+ checkwdg->setActive(value);
+ checkwdg->setProgrammatically = false;
+ checkwdg->set_undo_parameters(SP_VERB_DIALOG_LIVE_PATH_EFFECT, _("Change togglebutton parameter"));
+
+ _toggled_connection = checkwdg->signal_toggled().connect(sigc::mem_fun(*this, &ToggleButtonParam::toggled));
+
+ return checkwdg;
+}
+
+void
+ToggleButtonParam::refresh_button()
+{
+ if(!checkwdg){
+ return;
+ }
+ Gtk::Widget * boxButton = checkwdg->get_child();
+ if(!boxButton){
+ return;
+ }
+ GList * childs = gtk_container_get_children(GTK_CONTAINER(boxButton->gobj()));
+ guint totalWidgets = g_list_length (childs);
+ if (!param_label.empty()) {
+ if(value || inactiveLabel.empty()){
+ gtk_label_set_text(GTK_LABEL(g_list_nth_data(childs, totalWidgets-1)), param_label.c_str());
+ }else{
+ gtk_label_set_text(GTK_LABEL(g_list_nth_data(childs, totalWidgets-1)), inactiveLabel.c_str());
+ }
+ }
+ if ( iconActive ) {
+ GdkPixbuf * iconPixbuf = sp_pixbuf_new( iconSize, iconActive );
+ if(!value){
+ iconPixbuf = sp_pixbuf_new( iconSize, iconInactive);
+ }
+ gtk_image_set_from_pixbuf (GTK_IMAGE(g_list_nth_data(childs, 0)), iconPixbuf);
+ }
+}
+
+void
+ToggleButtonParam::param_setValue(bool newvalue)
+{
+ value = newvalue;
+ refresh_button();
+}
+
+void
+ToggleButtonParam::toggled() {
+ _signal_toggled.emit();
+}
+
+} /* namespace LivePathEffect */
+
+} /* namespace Inkscape */
+
+/*
+ Local Variables:
+ mode:c++
+ c-file-style:"stroustrup"
+ c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
+ indent-tabs-mode:nil
+ fill-column:99
+ End:
+*/
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4 :
diff --git a/src/live_effects/parameter/togglebutton.h b/src/live_effects/parameter/togglebutton.h
new file mode 100644
index 000000000..4e545bcfd
--- /dev/null
+++ b/src/live_effects/parameter/togglebutton.h
@@ -0,0 +1,77 @@
+#ifndef INKSCAPE_LIVEPATHEFFECT_PARAMETER_TOGGLEBUTTON_H
+#define INKSCAPE_LIVEPATHEFFECT_PARAMETER_TOGGLEBUTTON_H
+
+/*
+ * Copyright (C) Jabiertxo Arraiza Cenoz 2014
+ *
+ * Released under GNU GPL, read the file 'COPYING' for more information
+ */
+
+#include <glib.h>
+#include <sigc++/connection.h>
+#include <sigc++/signal.h>
+
+#include "live_effects/parameter/parameter.h"
+#include "icon-size.h"
+#include "ui/widget/registered-widget.h"
+
+namespace Inkscape {
+
+namespace LivePathEffect {
+
+/**
+ * class ToggleButtonParam:
+ * represents a Gtk::ToggleButton as a Live Path Effect parameter
+ */
+class ToggleButtonParam : public Parameter {
+public:
+ ToggleButtonParam( const Glib::ustring& label,
+ const Glib::ustring& tip,
+ const Glib::ustring& key,
+ Inkscape::UI::Widget::Registry* wr,
+ Effect* effect,
+ bool default_value = false,
+ const Glib::ustring& inactive_label = "",
+ char const * icon_active = NULL,
+ char const * icon_inactive = NULL,
+ Inkscape::IconSize icon_size = Inkscape::ICON_SIZE_SMALL_TOOLBAR);
+ virtual ~ToggleButtonParam();
+
+ virtual Gtk::Widget * param_newWidget();
+
+ virtual bool param_readSVGValue(const gchar * strvalue);
+ virtual gchar * param_getSVGValue() const;
+
+ void param_setValue(bool newvalue);
+ virtual void param_set_default();
+
+ bool get_value() const { return value; };
+
+ inline operator bool() const { return value; };
+
+ sigc::signal<void>& signal_toggled() { return _signal_toggled; }
+ virtual void toggled();
+
+private:
+ ToggleButtonParam(const ToggleButtonParam&);
+ ToggleButtonParam& operator=(const ToggleButtonParam&);
+
+ void refresh_button();
+ bool value;
+ bool defvalue;
+ const Glib::ustring inactiveLabel;
+ const char * iconActive;
+ const char * iconInactive;
+ Inkscape::IconSize iconSize;
+ Inkscape::UI::Widget::RegisteredToggleButton * checkwdg;
+
+ sigc::signal<void> _signal_toggled;
+ sigc::connection _toggled_connection;
+};
+
+
+} //namespace LivePathEffect
+
+} //namespace Inkscape
+
+#endif
diff --git a/src/live_effects/parameter/transformedpoint.cpp b/src/live_effects/parameter/transformedpoint.cpp
new file mode 100644
index 000000000..0d03432c3
--- /dev/null
+++ b/src/live_effects/parameter/transformedpoint.cpp
@@ -0,0 +1,182 @@
+/*
+ * Copyright (C) Theodore Janeczko 2012 <flutterguy317@gmail.com>
+ *
+ * Released under GNU GPL, read the file 'COPYING' for more information
+ */
+
+#include "ui/widget/registered-widget.h"
+#include "live_effects/parameter/transformedpoint.h"
+#include "sp-lpe-item.h"
+#include "knotholder.h"
+#include "svg/svg.h"
+#include "svg/stringstream.h"
+
+#include "live_effects/effect.h"
+#include "desktop.h"
+#include "verbs.h"
+
+#include <glibmm/i18n.h>
+
+namespace Inkscape {
+
+namespace LivePathEffect {
+
+TransformedPointParam::TransformedPointParam( const Glib::ustring& label, const Glib::ustring& tip,
+ const Glib::ustring& key, Inkscape::UI::Widget::Registry* wr,
+ Effect* effect, Geom::Point default_vector,
+ bool dontTransform)
+ : Parameter(label, tip, key, wr, effect),
+ defvalue(default_vector),
+ origin(0.,0.),
+ vector(default_vector),
+ noTransform(dontTransform)
+{
+ vec_knot_shape = SP_KNOT_SHAPE_DIAMOND;
+ vec_knot_mode = SP_KNOT_MODE_XOR;
+ vec_knot_color = 0xffffb500;
+}
+
+TransformedPointParam::~TransformedPointParam()
+{
+
+}
+
+void
+TransformedPointParam::param_set_default()
+{
+ setOrigin(Geom::Point(0.,0.));
+ setVector(defvalue);
+}
+
+bool
+TransformedPointParam::param_readSVGValue(const gchar * strvalue)
+{
+ gchar ** strarray = g_strsplit(strvalue, ",", 4);
+ if (!strarray) {
+ return false;
+ }
+ double val[4];
+ unsigned int i = 0;
+ while (i < 4 && strarray[i]) {
+ if (sp_svg_number_read_d(strarray[i], &val[i]) != 0) {
+ i++;
+ } else {
+ break;
+ }
+ }
+ g_strfreev (strarray);
+ if (i == 4) {
+ setOrigin( Geom::Point(val[0], val[1]) );
+ setVector( Geom::Point(val[2], val[3]) );
+ return true;
+ }
+ return false;
+}
+
+gchar *
+TransformedPointParam::param_getSVGValue() const
+{
+ Inkscape::SVGOStringStream os;
+ os << origin << " , " << vector;
+ gchar * str = g_strdup(os.str().c_str());
+ return str;
+}
+
+Gtk::Widget *
+TransformedPointParam::param_newWidget()
+{
+ Inkscape::UI::Widget::RegisteredVector * pointwdg = Gtk::manage(
+ new Inkscape::UI::Widget::RegisteredVector( param_label,
+ param_tooltip,
+ param_key,
+ *param_wr,
+ param_effect->getRepr(),
+ param_effect->getSPDoc() ) );
+ pointwdg->setPolarCoords();
+ pointwdg->setValue( vector, origin );
+ pointwdg->clearProgrammatically();
+ pointwdg->set_undo_parameters(SP_VERB_DIALOG_LIVE_PATH_EFFECT, _("Change vector parameter"));
+
+ Gtk::HBox * hbox = Gtk::manage( new Gtk::HBox() );
+ static_cast<Gtk::HBox*>(hbox)->pack_start(*pointwdg, true, true);
+ static_cast<Gtk::HBox*>(hbox)->show_all_children();
+
+ return dynamic_cast<Gtk::Widget *> (hbox);
+}
+
+void
+TransformedPointParam::set_and_write_new_values(Geom::Point const &new_origin, Geom::Point const &new_vector)
+{
+ setValues(new_origin, new_vector);
+ gchar * str = param_getSVGValue();
+ param_write_to_repr(str);
+ g_free(str);
+}
+
+void
+TransformedPointParam::param_transform_multiply(Geom::Affine const& postmul, bool /*set*/)
+{
+ if (!noTransform) {
+ set_and_write_new_values( origin * postmul, vector * postmul.withoutTranslation() );
+ }
+}
+
+
+void
+TransformedPointParam::set_vector_oncanvas_looks(SPKnotShapeType shape, SPKnotModeType mode, guint32 color)
+{
+ vec_knot_shape = shape;
+ vec_knot_mode = mode;
+ vec_knot_color = color;
+}
+
+void
+TransformedPointParam::set_oncanvas_color(guint32 color)
+{
+ vec_knot_color = color;
+}
+
+class TransformedPointParamKnotHolderEntity_Vector : public KnotHolderEntity {
+public:
+ TransformedPointParamKnotHolderEntity_Vector(TransformedPointParam *p) : param(p) { }
+ virtual ~TransformedPointParamKnotHolderEntity_Vector() {}
+
+ virtual void knot_set(Geom::Point const &p, Geom::Point const &/*origin*/, guint /*state*/) {
+ Geom::Point const s = p - param->origin;
+ /// @todo implement angle snapping when holding CTRL
+ param->setVector(s);
+ sp_lpe_item_update_patheffect(SP_LPE_ITEM(item), false, false);
+ };
+ virtual Geom::Point knot_get() const{
+ return param->origin + param->vector;
+ };
+ virtual void knot_click(guint /*state*/){
+ g_print ("This is the vector handle associated to parameter '%s'\n", param->param_key.c_str());
+ };
+
+private:
+ TransformedPointParam *param;
+};
+
+void
+TransformedPointParam::addKnotHolderEntities(KnotHolder *knotholder, SPDesktop *desktop, SPItem *item)
+{
+ TransformedPointParamKnotHolderEntity_Vector *vector_e = new TransformedPointParamKnotHolderEntity_Vector(this);
+ vector_e->create(desktop, item, knotholder, Inkscape::CTRL_TYPE_UNKNOWN, handleTip(), vec_knot_shape, vec_knot_mode, vec_knot_color);
+ knotholder->add(vector_e);
+}
+
+} /* namespace LivePathEffect */
+
+} /* namespace Inkscape */
+
+/*
+ Local Variables:
+ mode:c++
+ c-file-style:"stroustrup"
+ c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
+ indent-tabs-mode:nil
+ fill-column:99
+ End:
+*/
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4 :
diff --git a/src/live_effects/parameter/transformedpoint.h b/src/live_effects/parameter/transformedpoint.h
new file mode 100644
index 000000000..c96bedb53
--- /dev/null
+++ b/src/live_effects/parameter/transformedpoint.h
@@ -0,0 +1,82 @@
+#ifndef INKSCAPE_LIVEPATHEFFECT_PARAMETER_TRANSFORMED_POINT_H
+#define INKSCAPE_LIVEPATHEFFECT_PARAMETER_TRANSFORMED_POINT_H
+
+/*
+ * Inkscape::LivePathEffectParameters
+ *
+ * Copyright (C) Theodore Janeczko 2012 <flutterguy317@gmail.com>
+ *
+ * Released under GNU GPL, read the file 'COPYING' for more information
+ */
+
+#include <glib.h>
+#include <2geom/point.h>
+
+#include "live_effects/parameter/parameter.h"
+
+#include "knot-holder-entity.h"
+
+namespace Inkscape {
+
+namespace LivePathEffect {
+
+
+class TransformedPointParam : public Parameter {
+public:
+ TransformedPointParam( const Glib::ustring& label,
+ const Glib::ustring& tip,
+ const Glib::ustring& key,
+ Inkscape::UI::Widget::Registry* wr,
+ Effect* effect,
+ Geom::Point default_vector = Geom::Point(1,0),
+ bool dontTransform = false);
+ virtual ~TransformedPointParam();
+
+ virtual Gtk::Widget * param_newWidget();
+ inline const gchar *handleTip() const { return param_tooltip.c_str(); }
+
+ virtual bool param_readSVGValue(const gchar * strvalue);
+ virtual gchar * param_getSVGValue() const;
+
+ Geom::Point getVector() const { return vector; };
+ Geom::Point getOrigin() const { return origin; };
+ void setValues(Geom::Point const &new_origin, Geom::Point const &new_vector) { setVector(new_vector); setOrigin(new_origin); };
+ void setVector(Geom::Point const &new_vector) { vector = new_vector; };
+ void setOrigin(Geom::Point const &new_origin) { origin = new_origin; };
+ virtual void param_set_default();
+
+ void set_and_write_new_values(Geom::Point const &new_origin, Geom::Point const &new_vector);
+
+ virtual void param_transform_multiply(Geom::Affine const &postmul, bool set);
+
+ void set_vector_oncanvas_looks(SPKnotShapeType shape, SPKnotModeType mode, guint32 color);
+ void set_oncanvas_color(guint32 color);
+
+ virtual bool providesKnotHolderEntities() const { return true; }
+ virtual void addKnotHolderEntities(KnotHolder *knotholder, SPDesktop *desktop, SPItem *item);
+
+private:
+ TransformedPointParam(const TransformedPointParam&);
+ TransformedPointParam& operator=(const TransformedPointParam&);
+
+ Geom::Point defvalue;
+
+ Geom::Point origin;
+ Geom::Point vector;
+
+ bool noTransform;
+
+ /// The looks of the vector and origin knots oncanvas
+ SPKnotShapeType vec_knot_shape;
+ SPKnotModeType vec_knot_mode;
+ guint32 vec_knot_color;
+
+ friend class TransformedPointParamKnotHolderEntity_Vector;
+};
+
+
+} //namespace LivePathEffect
+
+} //namespace Inkscape
+
+#endif
diff --git a/src/live_effects/pathoutlineprovider.cpp b/src/live_effects/pathoutlineprovider.cpp
new file mode 100644
index 000000000..21a0fb809
--- /dev/null
+++ b/src/live_effects/pathoutlineprovider.cpp
@@ -0,0 +1,803 @@
+/* Author:
+ * Liam P. White <inkscapebrony@gmail.com>
+ *
+ * Copyright (C) 2014 Author
+ *
+ * Released under GNU GPL, read the file 'COPYING' for more information
+ */
+
+#include <2geom/angle.h>
+#include <2geom/path.h>
+#include <2geom/circle.h>
+#include <2geom/sbasis-to-bezier.h>
+#include <2geom/shape.h>
+#include <2geom/transforms.h>
+#include <2geom/path-sink.h>
+#include <cstdio>
+
+#include "pathoutlineprovider.h"
+#include "livarot/path-description.h"
+#include "helper/geom-nodetype.h"
+#include "svg/svg.h"
+
+namespace Geom {
+/**
+* Refer to: Weisstein, Eric W. "Circle-Circle Intersection."
+ From MathWorld--A Wolfram Web Resource.
+ http://mathworld.wolfram.com/Circle-CircleIntersection.html
+*
+* @return 0 if no intersection
+* @return 1 if one circle is contained in the other
+* @return 2 if intersections are found (they are written to p0 and p1)
+*/
+static int circle_circle_intersection(Circle const &circle0, Circle const &circle1, Point & p0, Point & p1)
+{
+ Point X0 = circle0.center();
+ double r0 = circle0.ray();
+ Point X1 = circle1.center();
+ double r1 = circle1.ray();
+
+ /* dx and dy are the vertical and horizontal distances between
+ * the circle centers.
+ */
+ Point D = X1 - X0;
+
+ /* Determine the straight-line distance between the centers. */
+ double d = L2(D);
+
+ /* Check for solvability. */
+ if (d > (r0 + r1)) {
+ /* no solution. circles do not intersect. */
+ return 0;
+ }
+ if (d <= fabs(r0 - r1)) {
+ /* no solution. one circle is contained in the other */
+ return 1;
+ }
+
+ /* 'point 2' is the point where the line through the circle
+ * intersection points crosses the line between the circle
+ * centers.
+ */
+
+ /* Determine the distance from point 0 to point 2. */
+ double a = ((r0*r0) - (r1*r1) + (d*d)) / (2.0 * d) ;
+
+ /* Determine the coordinates of point 2. */
+ Point p2 = X0 + D * (a/d);
+
+ /* Determine the distance from point 2 to either of the
+ * intersection points.
+ */
+ double h = std::sqrt((r0*r0) - (a*a));
+
+ /* Now determine the offsets of the intersection points from
+ * point 2.
+ */
+ Point r = (h/d)*rot90(D);
+
+ /* Determine the absolute intersection points. */
+ p0 = p2 + r;
+ p1 = p2 - r;
+
+ return 2;
+}
+/**
+* Find circle that touches inside of the curve, with radius matching the curvature, at time value \c t.
+* Because this method internally uses unitTangentAt, t should be smaller than 1.0 (see unitTangentAt).
+*/
+static Circle touching_circle( D2<SBasis> const &curve, double t, double tol=0.01 )
+{
+ D2<SBasis> dM=derivative(curve);
+ if ( are_near(L2sq(dM(t)),0.) ) {
+ dM=derivative(dM);
+ }
+ if ( are_near(L2sq(dM(t)),0.) ) { // try second time
+ dM=derivative(dM);
+ }
+ Piecewise<D2<SBasis> > unitv = unitVector(dM,tol);
+ Piecewise<SBasis> dMlength = dot(Piecewise<D2<SBasis> >(dM),unitv);
+ Piecewise<SBasis> k = cross(derivative(unitv),unitv);
+ k = divide(k,dMlength,tol,3);
+ double curv = k(t); // note that this value is signed
+
+ Geom::Point normal = unitTangentAt(curve, t).cw();
+ double radius = 1/curv;
+ Geom::Point center = curve(t) + radius*normal;
+ return Geom::Circle(center, fabs(radius));
+}
+
+std::vector<Geom::Path> split_at_cusps(const Geom::Path& in)
+{
+ PathVector out = PathVector();
+ Path temp = Path();
+
+ for (unsigned i = 0; i < in.size(); i++) {
+ temp.append(in[i]);
+ if ( get_nodetype(in[i], in[i + 1]) != Geom::NODE_SMOOTH ) {
+ out.push_back(temp);
+ temp = Path();
+ }
+ }
+ if (temp.size() > 0) {
+ out.push_back(temp);
+ }
+ return out;
+}
+
+Geom::CubicBezier sbasis_to_cubicbezier(Geom::D2<Geom::SBasis> const & sbasis_in)
+{
+ std::vector<Geom::Point> temp;
+ sbasis_to_bezier(temp, sbasis_in, 4);
+ return Geom::CubicBezier( temp );
+}
+
+static boost::optional<Geom::Point> intersection_point(Geom::Point const & origin_a, Geom::Point const & vector_a, Geom::Point const & origin_b, Geom::Point const & vector_b)
+{
+ Geom::Coord denom = cross(vector_b, vector_a);
+ if (!Geom::are_near(denom,0.)) {
+ Geom::Coord t = (cross(origin_a,vector_b) + cross(vector_b,origin_b)) / denom;
+ return origin_a + t * vector_a;
+ }
+ return boost::none;
+}
+
+} // namespace Geom
+
+namespace Outline {
+
+typedef Geom::D2<Geom::SBasis> D2SB;
+typedef Geom::Piecewise<D2SB> PWD2;
+
+// UTILITY
+
+unsigned bezierOrder (const Geom::Curve* curve_in)
+{
+ using namespace Geom;
+ if ( const BezierCurve* bz = dynamic_cast<const BezierCurve*>(curve_in) ) {
+ return bz->order();
+ }
+ return 0;
+}
+
+/**
+ * @return true if the angle formed by the curves and their handles is greater than 180 degrees clockwise, otherwise false.
+ */
+bool outside_angle (const Geom::Curve& cbc1, const Geom::Curve& cbc2)
+{
+ Geom::Point start_point;
+ Geom::Point cross_point = cbc1.finalPoint();
+ Geom::Point end_point;
+
+ if (cross_point != cbc2.initialPoint()) {
+ printf("WARNING: Non-contiguous path in Outline::outside_angle()");
+ return false;
+ }
+
+ Geom::CubicBezier cubicBezier = Geom::sbasis_to_cubicbezier(cbc1.toSBasis());
+ start_point = cubicBezier [2];
+
+ /*
+ * Because the node editor does not yet support true quadratics, paths are converted to
+ * cubic beziers in the node tool with degenerate handles on one side.
+ */
+
+ if (are_near(start_point, cross_point, 0.0000001)) {
+ start_point = cubicBezier [1];
+ }
+ cubicBezier = Geom::sbasis_to_cubicbezier(cbc2.toSBasis());
+ end_point = cubicBezier [1];
+ if (are_near(end_point, cross_point, 0.0000001)) {
+ end_point = cubicBezier [2];
+ }
+
+ // got our three points, now let's see what their clockwise angle is
+
+ // Definition of a Graham scan
+
+ /********************************************************************
+ # Three points are a counter-clockwise turn if ccw > 0, clockwise if
+ # ccw < 0, and collinear if ccw = 0 because ccw is a determinant that
+ # gives the signed area of the triangle formed by p1, p2 and p3.
+ function ccw(p1, p2, p3):
+ return (p2.x - p1.x)*(p3.y - p1.y) - (p2.y - p1.y)*(p3.x - p1.x)
+ *********************************************************************/
+
+ double ccw = ( (cross_point.x() - start_point.x()) * (end_point.y() - start_point.y()) ) -
+ ( (cross_point.y() - start_point.y()) * (end_point.x() - start_point.x()) );
+ return ccw > 0;
+}
+
+// LINE JOINS
+
+typedef Geom::BezierCurveN<1u> BezierLine;
+
+/**
+ * Removes the crossings on an interior join.
+ * @param path_builder Contains the incoming segment; result is appended to this
+ * @param outgoing The outgoing segment
+ */
+void joinInside(Geom::Path& path_builder, Geom::Curve const& outgoing)
+{
+ Geom::Curve const& incoming = path_builder.back();
+
+ // Using Geom::crossings to find intersections between two curves
+ Geom::Crossings cross = Geom::crossings(incoming, outgoing);
+ if (!cross.empty()) {
+ // Crossings found, create the join
+ Geom::CubicBezier cubic = Geom::sbasis_to_cubicbezier(incoming.toSBasis());
+ cubic = cubic.subdivide(cross[0].ta).first;
+ // erase the last segment, as we're going to overwrite it now
+ path_builder.erase_last();
+ path_builder.append(cubic, Geom::Path::STITCH_DISCONTINUOUS);
+
+ cubic = Geom::sbasis_to_cubicbezier(outgoing.toSBasis());
+ cubic = cubic.subdivide(cross[0].tb).second;
+ path_builder.append(cubic, Geom::Path::STITCH_DISCONTINUOUS);
+ } else {
+ // No crossings occurred, or Geom::crossings() failed; default to bevel
+ if (Geom::are_near(incoming.finalPoint(), outgoing.initialPoint())) {
+ path_builder.appendNew<BezierLine>(outgoing.initialPoint());
+ } else {
+ path_builder.setFinal(outgoing.initialPoint());
+ }
+ }
+}
+
+/**
+ * Try to create a miter join. Falls back to bevel if no miter can be created.
+ * @param path_builder Path to append curves to; back() is the incoming curve
+ * @param outgoing Outgoing curve.
+ * @param miter_limit When mitering, don't exceed this length
+ * @param line_width The thickness of the line.
+ */
+void miter_curves(Geom::Path& path_builder, Geom::Curve const& outgoing, double miter_limit, double line_width)
+{
+ using namespace Geom;
+ Curve const& incoming = path_builder.back();
+ Point tang1 = unitTangentAt(Geom::reverse(incoming.toSBasis()), 0.);
+ Point tang2 = unitTangentAt(outgoing.toSBasis(), 0);
+
+ boost::optional <Point> p = intersection_point (incoming.finalPoint(), tang1, outgoing.initialPoint(), tang2);
+ if (p) {
+ // check size of miter
+ Point point_on_path = incoming.finalPoint() - rot90(tang1) * line_width;
+ Coord len = distance(*p, point_on_path);
+ if (len <= miter_limit) {
+ // miter OK
+ path_builder.appendNew<BezierLine>(*p);
+ }
+ }
+ path_builder.appendNew<BezierLine>(outgoing.initialPoint());
+}
+
+/**
+ * Smoothly extrapolate curves along a circular route. Falls back to miter if necessary.
+ * @param path_builder Path to append curves to; back() is the incoming curve
+ * @param outgoing Outgoing curve.
+ * @param miter_limit When mitering, don't exceed this length
+ * @param line_width The thickness of the line. Used for miter fallback.
+ */
+void extrapolate_curves(Geom::Path& path_builder, Geom::Curve const& outgoing, double miter_limit, double line_width)
+{
+ Geom::Curve const& incoming = path_builder.back();
+ Geom::Point endPt = outgoing.initialPoint();
+
+ // The method used when extrapolating curves fails to work when either side of the join to be extrapolated
+ // is a line segment. When this situation is encountered, fall back to a regular miter join.
+ bool lineProblem = (dynamic_cast<const BezierLine *>(&incoming)) || (dynamic_cast<const BezierLine *>(&outgoing));
+ if (lineProblem == false) {
+ // Geom::Point tang1 = Geom::unitTangentAt(Geom::reverse(incoming.toSBasis()), 0.);
+ Geom::Point tang2 = Geom::unitTangentAt(outgoing.toSBasis(), 0);
+
+ Geom::Circle circle1 = Geom::touching_circle(Geom::reverse(incoming.toSBasis()), 0.);
+ Geom::Circle circle2 = Geom::touching_circle(outgoing.toSBasis(), 0);
+
+ Geom::Point points[2];
+ int solutions = Geom::circle_circle_intersection(circle1, circle2, points[0], points[1]);
+ if (solutions == 2) {
+ Geom::Point sol(0,0);
+ if ( dot(tang2,points[0]-endPt) > 0 ) {
+ // points[0] is bad, choose points[1]
+ sol = points[1];
+ } else if ( dot(tang2,points[1]-endPt) > 0 ) { // points[0] could be good, now check points[1]
+ // points[1] is bad, choose points[0]
+ sol = points[0];
+ } else {
+ // both points are good, choose nearest
+ sol = ( distanceSq(endPt, points[0]) < distanceSq(endPt, points[1]) ) ? points[0] : points[1];
+ }
+
+ Geom::EllipticalArc *arc0 = circle1.arc(incoming.finalPoint(), 0.5*(incoming.finalPoint()+sol), sol, true);
+ Geom::EllipticalArc *arc1 = circle2.arc(sol, 0.5*(sol+endPt), endPt, true);
+ try {
+ if (arc0) {
+ path_builder.append (arc0->toSBasis());
+ delete arc0;
+ arc0 = NULL;
+ } else {
+ throw std::exception();
+ }
+
+ if (arc1) {
+ path_builder.append (arc1->toSBasis());
+ delete arc1;
+ arc1 = NULL;
+ } else {
+ throw std::exception();
+ }
+
+ } catch (std::exception const & ex) {
+ printf("WARNING: Error extrapolating line join: %s\n", ex.what());
+ path_builder.appendNew<Geom::LineSegment>(endPt);
+ }
+ } else {
+ // 1 or no solutions found, default to miter
+ miter_curves(path_builder, outgoing, miter_limit, line_width);
+ }
+ } else {
+ // Line segments exist
+ miter_curves(path_builder, outgoing, miter_limit, line_width);
+ }
+}
+
+/**
+ * Extrapolate curves by reflecting them along the line that would be given by beveling the join.
+ * @param path_builder Path to append curves to; back() is the incoming curve
+ * @param outgoing Outgoing curve.
+ * @param miter_limit When mitering, don't exceed this length
+ * @param line_width The thickness of the line. Used for miter fallback.
+ */
+void reflect_curves(Geom::Path& path_builder, Geom::Curve const& outgoing, double miter_limit, double line_width)
+{
+ using namespace Geom;
+ Curve const& incoming = path_builder.back();
+ // On the outside, we'll take the incoming curve, the outgoing curve, and
+ // reflect them over the line formed by taking the unit tangent vector at times
+ // 0 and 1, respectively, rotated by 90 degrees.
+ Crossings cross;
+
+ // reflect curves along the line that would be given by beveling the join
+ Point tang1 = unitTangentAt(reverse(incoming.toSBasis()), 0.);
+ D2SB newcurve1 = incoming.toSBasis() * reflection(-rot90(tang1), incoming.finalPoint());
+ CubicBezier bzr1 = sbasis_to_cubicbezier(reverse(newcurve1));
+
+ Point tang2 = Geom::unitTangentAt(outgoing.toSBasis(), 0.);
+ D2SB newcurve2 = outgoing.toSBasis() * reflection(-rot90(tang2), outgoing.initialPoint());
+ CubicBezier bzr2 = sbasis_to_cubicbezier(reverse(newcurve2));
+
+ cross = crossings(bzr1, bzr2);
+ if (cross.empty()) {
+ // paths don't cross, fall back to miter
+ miter_curves(path_builder, outgoing, miter_limit, line_width);
+ } else {
+ // reflected join
+ std::pair<CubicBezier, CubicBezier> sub1 = bzr1.subdivide(cross[0].ta);
+ std::pair<CubicBezier, CubicBezier> sub2 = bzr2.subdivide(cross[0].tb);
+
+ // TODO it seems as if a bug in 2geom sometimes doesn't catch the first
+ // crossing of paths, but the second instead; but only sometimes.
+ path_builder.appendNew <CubicBezier> (sub1.first[1], sub1.first[2], sub2.second[0]);
+ path_builder.appendNew <CubicBezier> (sub2.second[1], sub2.second[2], outgoing.initialPoint());
+ }
+}
+
+// Ideal function pointer we want to pass
+typedef void JoinFunc(Geom::Path& /*path_builder*/, Geom::Curve const& /*outgoing*/, double /*miter_limit*/, double /*line_width*/);
+
+/**
+ * Helper function for repeated logic in outlineHalf.
+ */
+static void outlineHelper(Geom::Path& path_builder, Geom::PathVector* path_vec, bool outside, double width, double miter, JoinFunc func)
+{
+ Geom::Curve * cbc2 = path_vec->front()[0].duplicate();
+
+ if (outside) {
+ func(path_builder, *cbc2, miter, width);
+ } else {
+ joinInside(path_builder, *cbc2);
+ }
+
+ // store it
+ Geom::Path temp_path = path_vec->front();
+ if (!outside) {
+ // erase the first segment since the inside join code already appended it
+ temp_path.erase(temp_path.begin());
+ }
+
+ if (temp_path.initialPoint() != path_builder.finalPoint()) {
+ temp_path.setInitial(path_builder.finalPoint());
+ }
+
+ path_builder.append(temp_path);
+
+ delete cbc2;
+}
+
+/**
+ * Offsets exactly one half of a bezier spline (path).
+ * @param path_in The input path to use. (To create the other side use path_in.reverse() )
+ * @param line_width the line width to use (usually you want to divide this by 2)
+ * @param miter_limit the miter parameter
+ * @param func Join function to apply at each join.
+ */
+
+Geom::Path outlineHalf(const Geom::Path& path_in, double line_width, double miter_limit, JoinFunc func)
+{
+ // NOTE: it is important to notice the distinction between a Geom::Path and a livarot ::Path here!
+ // if you do not see "Geom::" there is a different function set!
+
+ Geom::PathVector pv = split_at_cusps(path_in);
+
+ ::Path to_outline;
+ ::Path outlined_result;
+
+ Geom::Path path_builder = Geom::Path(); // the path to store the result in
+ Geom::PathVector* path_vec; // needed because livarot returns a pointer (TODO make this not a pointer)
+
+ // Do two curves at a time for efficiency, since the join function needs to know the outgoing curve as well
+ const size_t k = pv.size();
+ for (size_t u = 0; u < k; u += 2) {
+ to_outline = Path();
+ outlined_result = Path();
+
+ to_outline.LoadPath(pv[u], Geom::identity(), false, false);
+ to_outline.OutsideOutline(&outlined_result, line_width / 2, join_straight, butt_straight, 10);
+ // now a curve has been outside outlined and loaded into outlined_result
+
+ // get the Geom::Path
+ path_vec = outlined_result.MakePathVector();
+
+ // on the first run through, there is no join
+ if (u == 0) {
+ path_builder.start(path_vec->front().initialPoint());
+ path_builder.append(path_vec->front());
+ } else {
+ outlineHelper(path_builder, path_vec, outside_angle(pv[u-1][pv[u-1].size()-1], pv[u][0]), line_width, miter_limit, func);
+ }
+
+ // outline the next segment, but don't store it yet
+ if (path_vec)
+ delete path_vec;
+ path_vec = NULL;
+
+ // odd number of paths
+ if (u < k - 1) {
+ outlined_result = Path();
+ to_outline = Path();
+
+ to_outline.LoadPath(pv[u+1], Geom::Affine(), false, false);
+ to_outline.OutsideOutline(&outlined_result, line_width / 2, join_straight, butt_straight, 10);
+
+ path_vec = outlined_result.MakePathVector();
+ outlineHelper(path_builder, path_vec, outside_angle(pv[u][pv[u].size()-1], pv[u+1][0]), line_width, miter_limit, func);
+
+ if (path_vec)
+ delete path_vec;
+ path_vec = NULL;
+ }
+ }
+
+ if (path_in.closed()) {
+ Geom::Curve * cbc1;
+ Geom::Curve * cbc2;
+
+ if ( path_in[path_in.size()].isDegenerate() ) {
+ // handle case for last segment curved
+ outlined_result = Path();
+ to_outline = Path();
+
+ Geom::Path oneCurve; oneCurve.append(path_in[0]);
+
+ to_outline.LoadPath(oneCurve, Geom::Affine(), false, false);
+ to_outline.OutsideOutline(&outlined_result, line_width / 2, join_straight, butt_straight, 10);
+
+ path_vec = outlined_result.MakePathVector();
+
+ cbc1 = path_builder[path_builder.size() - 1].duplicate();
+ cbc2 = path_vec->front()[0].duplicate();
+
+ delete path_vec;
+ } else {
+ // handle case for last segment straight
+ // since the path doesn't actually give us access to it, we'll do it ourselves
+ outlined_result = Path();
+ to_outline = Path();
+
+ Geom::Path oneCurve; oneCurve.append(Geom::LineSegment(path_in.finalPoint(), path_in.initialPoint()));
+
+ to_outline.LoadPath(oneCurve, Geom::Affine(), false, false);
+ to_outline.OutsideOutline(&outlined_result, line_width / 2, join_straight, butt_straight, 10);
+
+ path_vec = outlined_result.MakePathVector();
+
+ cbc1 = path_builder[path_builder.size() - 1].duplicate();
+ cbc2 = (*path_vec)[0] [0].duplicate();
+
+ outlineHelper(path_builder, path_vec, outside_angle(path_in[path_in.size()-1], oneCurve[0]), line_width, miter_limit, func);
+
+ delete cbc1;
+ cbc1 = cbc2->duplicate();
+ delete path_vec;
+
+ oneCurve = Geom::Path(); oneCurve.append(path_in[0]);
+
+ to_outline.LoadPath(oneCurve, Geom::Affine(), false, false);
+ to_outline.OutsideOutline(&outlined_result, line_width / 2, join_straight, butt_straight, 10);
+
+ path_vec = outlined_result.MakePathVector();
+ delete cbc2; cbc2 = (*path_vec)[0] [0].duplicate();
+ delete path_vec;
+ }
+
+ Geom::Path temporary;
+ temporary.append(*cbc1);
+
+ Geom::Curve const & prev_curve = path_in[path_in.size()].isDegenerate() ? path_in[path_in.size() - 1] : path_in[path_in.size()];
+ Geom::Path isStraight;
+ isStraight.append(prev_curve);
+ isStraight.append(path_in[0]);
+ // does closing path require a join?
+ if (Geom::split_at_cusps(isStraight).size() > 1) {
+ bool outside = outside_angle(prev_curve, path_in[0]);
+ if (outside) {
+ func(temporary, *cbc2, miter_limit, line_width);
+ } else {
+ joinInside(temporary, *cbc2);
+ path_builder.erase(path_builder.begin());
+ }
+
+ // extract the appended curves
+ path_builder.erase_last();
+ if (Geom::are_near(path_builder.finalPoint(), temporary.initialPoint())) {
+ path_builder.setFinal(temporary.initialPoint());
+ } else {
+ path_builder.appendNew<BezierLine>(temporary.initialPoint());
+ }
+ path_builder.append(temporary);
+ } else {
+ // closing path does not require a join
+ path_builder.setFinal(path_builder.initialPoint());
+ }
+ path_builder.close();
+
+ if (cbc1) delete cbc1;
+ if (cbc2) delete cbc2;
+ }
+
+ return path_builder;
+}
+
+Geom::PathVector outlinePath(const Geom::PathVector& path_in, double line_width, LineJoinType join, ButtTypeMod butt, double miter_lim, bool extrapolate, double start_lean, double end_lean)
+{
+ Geom::PathVector path_out;
+
+ unsigned pv_size = path_in.size();
+ for (unsigned i = 0; i < pv_size; i++) {
+
+ if (path_in[i].size() > 1) {
+ Geom::Path with_direction;
+ Geom::Path against_direction;
+
+ with_direction = Outline::outlineHalf(path_in[i], -line_width, miter_lim, extrapolate ? extrapolate_curves : reflect_curves);
+ against_direction = Outline::outlineHalf(path_in[i].reverse(), -line_width, miter_lim, extrapolate ? extrapolate_curves : reflect_curves);
+
+ Geom::PathBuilder pb;
+
+ pb.moveTo(with_direction.initialPoint());
+ pb.append(with_direction);
+
+ //add in our line caps
+ if (!path_in[i].closed()) {
+ switch (butt) {
+ case BUTT_STRAIGHT:
+ pb.lineTo(against_direction.initialPoint());
+ break;
+ case BUTT_ROUND:
+ pb.arcTo((-line_width) / 2, (-line_width) / 2, 0., true, true, against_direction.initialPoint() );
+ break;
+ case BUTT_POINTY: {
+ Geom::Point end_deriv = -Geom::unitTangentAt(Geom::reverse(path_in[i].back().toSBasis()), 0.);
+ double radius = 0.5 * Geom::distance(with_direction.finalPoint(), against_direction.initialPoint());
+ Geom::Point midpoint = 0.5 * (with_direction.finalPoint() + against_direction.initialPoint()) + radius*end_deriv;
+ pb.lineTo(midpoint);
+ pb.lineTo(against_direction.initialPoint());
+ break;
+ }
+ case BUTT_SQUARE: {
+ Geom::Point end_deriv = -Geom::unitTangentAt(Geom::reverse(path_in[i].back().toSBasis()), 0.);
+ double radius = 0.5 * Geom::distance(with_direction.finalPoint(), against_direction.initialPoint());
+ pb.lineTo(with_direction.finalPoint() + radius*end_deriv);
+ pb.lineTo(against_direction.initialPoint() + radius*end_deriv);
+ pb.lineTo(against_direction.initialPoint());
+ break;
+ }
+ case BUTT_LEANED: {
+ Geom::Point end_deriv = -Geom::unitTangentAt(Geom::reverse(path_in[i].back().toSBasis()), 0.);
+ double maxRadius = (end_lean+0.5) * Geom::distance(with_direction.finalPoint(), against_direction.initialPoint());
+ double minRadius = ((end_lean*-1)+0.5) * Geom::distance(with_direction.finalPoint(), against_direction.initialPoint());
+ pb.lineTo(with_direction.finalPoint() + maxRadius*end_deriv);
+ pb.lineTo(against_direction.initialPoint() + minRadius*end_deriv);
+ pb.lineTo(against_direction.initialPoint());
+ break;
+ }
+ }
+ } else {
+ pb.moveTo(against_direction.initialPoint());
+ }
+
+ pb.append(against_direction);
+
+ //cap (if necessary)
+ if (!path_in[i].closed()) {
+ switch (butt) {
+ case BUTT_STRAIGHT:
+ pb.lineTo(with_direction.initialPoint());
+ break;
+ case BUTT_ROUND:
+ pb.arcTo((-line_width) / 2, (-line_width) / 2, 0., true, true, with_direction.initialPoint() );
+ break;
+ case BUTT_POINTY: {
+ Geom::Point end_deriv = -Geom::unitTangentAt(path_in[i].front().toSBasis(), 0.);
+ double radius = 0.5 * Geom::distance(against_direction.finalPoint(), with_direction.initialPoint());
+ Geom::Point midpoint = 0.5 * (against_direction.finalPoint() + with_direction.initialPoint()) + radius*end_deriv;
+ pb.lineTo(midpoint);
+ pb.lineTo(with_direction.initialPoint());
+ break;
+ }
+ case BUTT_SQUARE: {
+ Geom::Point end_deriv = -Geom::unitTangentAt(path_in[i].front().toSBasis(), 0.);
+ double radius = 0.5 * Geom::distance(against_direction.finalPoint(), with_direction.initialPoint());
+ pb.lineTo(against_direction.finalPoint() + radius*end_deriv);
+ pb.lineTo(with_direction.initialPoint() + radius*end_deriv);
+ pb.lineTo(with_direction.initialPoint());
+ break;
+ }
+ case BUTT_LEANED: {
+ Geom::Point end_deriv = -Geom::unitTangentAt(path_in[i].front().toSBasis(), 0.);
+ double maxRadius = (start_lean+0.5) * Geom::distance(against_direction.finalPoint(), with_direction.initialPoint());
+ double minRadius = ((start_lean*-1)+0.5) * Geom::distance(against_direction.finalPoint(), with_direction.initialPoint());
+ pb.lineTo(against_direction.finalPoint() + minRadius*end_deriv);
+ pb.lineTo(with_direction.initialPoint() + maxRadius*end_deriv);
+ pb.lineTo(with_direction.initialPoint());
+ break;
+ }
+ }
+ }
+ pb.flush();
+ path_out.push_back(pb.peek()[0]);
+ if (path_in[i].closed()) {
+ path_out.push_back(pb.peek()[1]);
+ }
+ } else {
+ Path p = Path();
+ Path outlinepath = Path();
+ ButtType original_butt;
+ switch (butt) {
+ case BUTT_STRAIGHT:
+ original_butt = butt_straight;
+ break;
+ case BUTT_ROUND:
+ original_butt = butt_round;
+ break;
+ case butt_pointy: {
+ original_butt = butt_pointy;
+ break;
+ }
+ case BUTT_SQUARE: {
+ original_butt = butt_square;
+ break;
+ }
+ case BUTT_LEANED: {
+ original_butt = butt_straight;
+ break;
+ }
+ }
+ p.LoadPath(path_in[i], Geom::Affine(), false, false);
+ p.Outline(&outlinepath, line_width / 2, static_cast<join_typ>(join), original_butt, miter_lim);
+ Geom::PathVector *pv_p = outlinepath.MakePathVector();
+ //somewhat hack-ish
+ path_out.push_back( (*pv_p)[0].reverse() );
+ if (pv_p) delete pv_p;
+ }
+ }
+ return path_out;
+}
+
+#define miter_lim fabs(line_width * miter_limit)
+
+Geom::PathVector PathVectorOutline(Geom::PathVector const & path_in, double line_width, ButtTypeMod linecap_type, LineJoinType linejoin_type, double miter_limit, double start_lean, double end_lean)
+{
+ std::vector<Geom::Path> path_out = std::vector<Geom::Path>();
+ if (path_in.empty()) {
+ return path_out;
+ }
+ Path p = Path();
+ Path outlinepath = Path();
+ for (unsigned i = 0; i < path_in.size(); i++) {
+ p.LoadPath(path_in[i], Geom::Affine(), false, ( (i==0) ? false : true));
+ }
+
+ // magic!
+ ButtType original_butt;
+ switch (linecap_type) {
+ case BUTT_STRAIGHT:
+ original_butt = butt_straight;
+ break;
+ case BUTT_ROUND:
+ original_butt = butt_round;
+ break;
+ case butt_pointy: {
+ original_butt = butt_pointy;
+ break;
+ }
+ case BUTT_SQUARE: {
+ original_butt = butt_square;
+ break;
+ }
+ case BUTT_LEANED: {
+ original_butt = butt_straight;
+ break;
+ }
+ }
+ if (linejoin_type <= LINEJOIN_POINTY) {
+ p.Outline(&outlinepath, line_width / 2, static_cast<join_typ>(linejoin_type),
+ original_butt, miter_lim);
+ // fix memory leak
+ std::vector<Geom::Path> *pv_p = outlinepath.MakePathVector();
+ path_out = *pv_p;
+ delete pv_p;
+
+ } else if (linejoin_type == LINEJOIN_REFLECTED) {
+ // reflected arc join
+ path_out = outlinePath(path_in, line_width, static_cast<LineJoinType>(linejoin_type),
+ linecap_type , miter_lim, false, start_lean, end_lean);
+
+ } else if (linejoin_type == LINEJOIN_EXTRAPOLATED) {
+ // extrapolated arc join
+ path_out = outlinePath(path_in, line_width, LINEJOIN_STRAIGHT, linecap_type, miter_lim, true, start_lean, end_lean);
+ }
+
+ return path_out;
+}
+
+Geom::Path PathOutsideOutline(Geom::Path const & path_in, double line_width, LineJoinType linejoin_type, double miter_limit)
+{
+
+ Geom::Path path_out;
+
+ if (linejoin_type <= LINEJOIN_POINTY || path_in.size() <= 1) {
+
+ Geom::PathVector * pathvec;
+
+ Path path_tangent = Path();
+ Path path_outline = Path();
+ path_outline.LoadPath(path_in, Geom::Affine(), false, false);
+ path_outline.OutsideOutline(&path_tangent, line_width / 2, static_cast<join_typ>(linejoin_type), butt_straight, miter_lim);
+
+ pathvec = path_tangent.MakePathVector();
+ path_out = pathvec->front();
+ delete pathvec;
+ return path_out;
+ } else if (linejoin_type == LINEJOIN_REFLECTED) {
+ path_out = outlineHalf(path_in, line_width, miter_lim, reflect_curves);
+ return path_out;
+ } else if (linejoin_type == LINEJOIN_EXTRAPOLATED) {
+ path_out = outlineHalf(path_in, line_width, miter_lim, extrapolate_curves);
+ return path_out;
+ }
+ return path_out;
+}
+
+} // namespace Outline
+
+/*
+ Local Variables:
+ mode:c++
+ c-file-style:"stroustrup"
+ c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
+ indent-tabs-mode:nil
+ fill-column:99
+ End:
+*/
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8 :
diff --git a/src/live_effects/pathoutlineprovider.h b/src/live_effects/pathoutlineprovider.h
new file mode 100644
index 000000000..c17584be2
--- /dev/null
+++ b/src/live_effects/pathoutlineprovider.h
@@ -0,0 +1,55 @@
+#ifndef SEEN_PATH_OUTLINE_H
+#define SEEN_PATH_OUTLINE_H
+
+/* Author:
+ * Liam P. White <inkscapebrony@gmail.com>
+ *
+ * Copyright (C) 2014 Author
+ *
+ * Released under GNU GPL, read the file 'COPYING' for more information
+ */
+
+#include <livarot/Path.h>
+#include <livarot/LivarotDefs.h>
+
+enum LineJoinType {
+ LINEJOIN_STRAIGHT,
+ LINEJOIN_ROUND,
+ LINEJOIN_POINTY,
+ LINEJOIN_REFLECTED,
+ LINEJOIN_EXTRAPOLATED
+};
+enum ButtTypeMod {
+ BUTT_STRAIGHT,
+ BUTT_ROUND,
+ BUTT_SQUARE,
+ BUTT_POINTY,
+ BUTT_LEANED
+};
+
+namespace Geom
+{
+ Geom::CubicBezier sbasis_to_cubicbezier(Geom::D2<Geom::SBasis> const & sbasis_in);
+ std::vector<Geom::Path> split_at_cusps(const Geom::Path& in);
+}
+
+namespace Outline
+{
+ unsigned bezierOrder (const Geom::Curve* curve_in);
+ std::vector<Geom::Path> PathVectorOutline(std::vector<Geom::Path> const & path_in, double line_width, ButtTypeMod linecap_type,
+ LineJoinType linejoin_type, double miter_limit, double start_lean = 0, double end_lean = 0);
+ Geom::Path PathOutsideOutline(Geom::Path const & path_in, double line_width, LineJoinType linejoin_type, double miter_limit);
+}
+
+#endif // SEEN_PATH_OUTLINE_H
+
+/*
+ Local Variables:
+ mode:c++
+ c-file-style:"stroustrup"
+ c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
+ indent-tabs-mode:nil
+ fill-column:99
+ End:
+*/
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8 :
diff --git a/src/macros.h b/src/macros.h
index b221ebdc2..cbb9bca78 100644
--- a/src/macros.h
+++ b/src/macros.h
@@ -1,7 +1,7 @@
-#ifndef __MACROS_H__
-#define __MACROS_H__
+#ifndef SEEN_MACROS_H
+#define SEEN_MACROS_H
-/*
+/**
* Useful macros for inkscape
*
* Author:
@@ -12,6 +12,9 @@
* Released under GNU GPL
*/
+// I'm of the opinion that this file should be removed, so I will in the future take the necessary steps to wipe it out.
+// Macros are not in general bad, but these particular ones are rather ugly. Especially that sp_round one. --Liam
+
#ifdef SP_MACROS_SILENT
#define SP_PRINT_MATRIX(s,m)
#define SP_PRINT_TRANSFORM(s,t)
@@ -51,4 +54,4 @@
fill-column:99
End:
*/
-// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8 :
diff --git a/src/main-cmdlineact.h b/src/main-cmdlineact.h
index fe11357fa..c8ef64f10 100644
--- a/src/main-cmdlineact.h
+++ b/src/main-cmdlineact.h
@@ -15,20 +15,18 @@
* Released under GNU GPL v2.x, read the file 'COPYING' for more information
*/
-#include <glib.h>
-
namespace Inkscape {
class ActionContext;
class CmdLineAction {
bool _isVerb;
- gchar * _arg;
+ char * _arg;
static std::list <CmdLineAction *> _list;
public:
- CmdLineAction (bool isVerb, gchar const * arg);
+ CmdLineAction (bool isVerb, char const * arg);
virtual ~CmdLineAction ();
void doIt (ActionContext const & context);
diff --git a/src/main.cpp b/src/main.cpp
index 517ba0506..caec66b05 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -64,7 +64,7 @@
#include "layer-model.h"
#include "selection.h"
#include "sp-object.h"
-#include "interface.h"
+#include "ui/interface.h"
#include "print.h"
#include "color.h"
#include "sp-item.h"
diff --git a/src/menus-skeleton.h b/src/menus-skeleton.h
index f888555d2..18a26d82c 100644
--- a/src/menus-skeleton.h
+++ b/src/menus-skeleton.h
@@ -178,6 +178,9 @@ static char const menus_skeleton[] =
" <verb verb-id=\"DialogLayers\" />\n"
" </submenu>\n"
" <submenu name=\"" N_("_Object") "\">\n"
+" <verb verb-id=\"DialogObjects\" />\n"
+" <verb verb-id=\"DialogTags\" />\n"
+" <separator/>\n"
" <verb verb-id=\"DialogFillStroke\" />\n"
" <verb verb-id=\"DialogObjectProperties\" />\n"
" <verb verb-id=\"DialogSymbols\" />\n"
diff --git a/src/message-context.h b/src/message-context.h
index a92874d68..ea86c4ec0 100644
--- a/src/message-context.h
+++ b/src/message-context.h
@@ -14,8 +14,9 @@
#ifndef SEEN_INKSCAPE_MESSAGE_CONTEXT_H
#define SEEN_INKSCAPE_MESSAGE_CONTEXT_H
-#include <stdarg.h>
+#include <cstdarg>
#include <glib.h>
+
#include "message.h"
namespace Inkscape {
@@ -48,7 +49,7 @@ public:
* @param type the message type
* @param message the message text
*/
- void set(MessageType type, gchar const *message);
+ void set(MessageType type, char const *message);
/** @brief pushes a message on the stack using prinf-style formatting,
* and replacing our old message
@@ -56,7 +57,7 @@ public:
* @param type the message type
* @param format a printf-style formatting string
*/
- void setF(MessageType type, gchar const *format, ...) G_GNUC_PRINTF(3,4);
+ void setF(MessageType type, char const *format, ...) G_GNUC_PRINTF(3,4);
/** @brief pushes a message on the stack using printf-style formatting,
* and a stdarg argument list
@@ -65,7 +66,7 @@ public:
* @param format a printf-style formatting string
* @param args printf-style arguments
*/
- void setVF(MessageType type, gchar const *format, va_list args);
+ void setVF(MessageType type, char const *format, va_list args);
/** @brief pushes a message onto the stack for a brief period of time
* without disturbing our "current" message
@@ -73,7 +74,7 @@ public:
* @param type the message type
* @param message the message text
*/
- void flash(MessageType type, gchar const *message);
+ void flash(MessageType type, char const *message);
/** @brief pushes a message onto the stack for a brief period of time
* using printf-style formatting, without disturbing our current
@@ -82,7 +83,7 @@ public:
* @param type the message type
* @param format a printf-style formatting string
*/
- void flashF(MessageType type, gchar const *format, ...) G_GNUC_PRINTF(3,4);
+ void flashF(MessageType type, char const *format, ...) G_GNUC_PRINTF(3,4);
/** @brief pushes a message onto the stack for a brief period of time
* using printf-style formatting and a stdarg argument list;
@@ -92,7 +93,7 @@ public:
* @param format a printf-style formatting string
* @param args printf-style arguments
*/
- void flashVF(MessageType type, gchar const *format, va_list args);
+ void flashVF(MessageType type, char const *format, va_list args);
/** @brief removes our current message from the stack */
void clear();
diff --git a/src/message-stack.h b/src/message-stack.h
index 3b8307761..42bf4e8a7 100644
--- a/src/message-stack.h
+++ b/src/message-stack.h
@@ -16,11 +16,12 @@
#ifndef SEEN_INKSCAPE_MESSAGE_STACK_H
#define SEEN_INKSCAPE_MESSAGE_STACK_H
-#include <stddef.h>
-#include <sigc++/sigc++.h>
-#include <glib.h>
-#include <stdarg.h>
+#include <cstdarg>
+#include <cstddef>
+#include <glib.h> // G_GNUC_PRINTF is the only thing worth having from here
#include <glibmm/ustring.h>
+#include <sigc++/sigc++.h>
+
#include "gc-managed.h"
#include "gc-finalized.h"
#include "gc-anchored.h"
@@ -61,14 +62,14 @@ public:
/** @brief returns the text of the message currently at the top of
* the stack
*/
- gchar const *currentMessage() {
+ char const *currentMessage() {
return _messages ? _messages->message : NULL;
}
/** @brief connects to the "changed" signal which is emitted whenever
* the topmost message on the stack changes.
*/
- sigc::connection connectChanged(sigc::slot<void, MessageType, gchar const *> slot)
+ sigc::connection connectChanged(sigc::slot<void, MessageType, char const *> slot)
{
return _changed_signal.connect(slot);
}
@@ -80,7 +81,7 @@ public:
*
* @return the id of the pushed message
*/
- MessageId push(MessageType type, gchar const *message);
+ MessageId push(MessageType type, char const *message);
/** @brief pushes a message onto the stack using printf-like formatting
*
@@ -89,7 +90,7 @@ public:
*
* @return the id of the pushed message
*/
- MessageId pushF(MessageType type, gchar const *format, ...) G_GNUC_PRINTF(3,4);
+ MessageId pushF(MessageType type, char const *format, ...) G_GNUC_PRINTF(3,4);
/** @brief pushes a message onto the stack using printf-like formatting,
* using a stdarg argument list
@@ -100,7 +101,7 @@ public:
*
* @return the id of the pushed message
*/
- MessageId pushVF(MessageType type, gchar const *format, va_list args);
+ MessageId pushVF(MessageType type, char const *format, va_list args);
/** @brief removes a message from the stack, given its id
*
@@ -119,7 +120,7 @@ public:
*
* @return the id of the pushed message
*/
- MessageId flash(MessageType type, gchar const *message);
+ MessageId flash(MessageType type, char const *message);
/**
* Temporarily pushes a message onto the stack.
@@ -140,7 +141,7 @@ public:
*
* @return the id of the pushed message
*/
- MessageId flashF(MessageType type, gchar const *format, ...) G_GNUC_PRINTF(3,4);
+ MessageId flashF(MessageType type, char const *format, ...) G_GNUC_PRINTF(3,4);
/** @brief temporarily pushes a message onto the stack using
* printf-like formatting, using a stdarg argument list
@@ -151,7 +152,7 @@ public:
*
* @return the id of the pushed message
*/
- MessageId flashVF(MessageType type, gchar const *format, va_list args);
+ MessageId flashVF(MessageType type, char const *format, va_list args);
private:
struct Message {
@@ -167,13 +168,13 @@ private:
void operator=(MessageStack const &); // no assign
/// pushes a message onto the stack with an optional timeout
- MessageId _push(MessageType type, guint lifetime, gchar const *message);
+ MessageId _push(MessageType type, unsigned int lifetime, char const *message);
Message *_discard(Message *m); ///< frees a message struct and returns the next such struct in the list
void _emitChanged(); ///< emits the "changed" signal
- static gboolean _timeout(gpointer data); ///< callback to expire flashed messages
+ static int _timeout(void* data); ///< callback to expire flashed messages
- sigc::signal<void, MessageType, gchar const *> _changed_signal;
+ sigc::signal<void, MessageType, char const *> _changed_signal;
Message *_messages; ///< the stack of messages as a linked list
MessageId _next_id; ///< the next message id to assign
};
diff --git a/src/number-opt-number.h b/src/number-opt-number.h
index d9ab56102..f6fe584f9 100644
--- a/src/number-opt-number.h
+++ b/src/number-opt-number.h
@@ -13,27 +13,23 @@
* Released under GNU GPL, read the file 'COPYING' for more information
*/
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
#include <glib.h>
#include <glib/gprintf.h>
-//todo: use glib instead of stdlib
-#include <stdlib.h>
+#include <cstdlib>
+
#include "svg/stringstream.h"
class NumberOptNumber {
public:
- gfloat number;
+ float number;
- gfloat optNumber;
+ float optNumber;
- guint _set : 1;
+ unsigned int _set : 1;
- guint optNumber_set : 1;
+ unsigned int optNumber_set : 1;
NumberOptNumber()
{
@@ -44,27 +40,27 @@ public:
optNumber_set = FALSE;
}
- gfloat getNumber()
+ float getNumber()
{
if(_set)
return number;
return -1;
}
- gfloat getOptNumber()
+ float getOptNumber()
{
if(optNumber_set)
return optNumber;
return -1;
}
- void setOptNumber(gfloat num)
+ void setOptNumber(float num)
{
optNumber_set = true;
optNumber = num;
}
- void setNumber(gfloat num)
+ void setNumber(float num)
{
_set = true;
number = num;
@@ -78,7 +74,7 @@ public:
return _set;
}
- gchar *getValueString()
+ char *getValueString()
{
Inkscape::SVGOStringStream os;
@@ -96,12 +92,12 @@ public:
return g_strdup(os.str().c_str());
}
- void set(gchar const *str)
+ void set(char const *str)
{
if(!str)
return;
- gchar **values = g_strsplit(str, " ", 2);
+ char **values = g_strsplit(str, " ", 2);
if( values[0] != NULL )
{
diff --git a/src/object-hierarchy.cpp b/src/object-hierarchy.cpp
index f2bf177dc..f241da83d 100644
--- a/src/object-hierarchy.cpp
+++ b/src/object-hierarchy.cpp
@@ -9,6 +9,9 @@
* Released under GNU GPL, read the file 'COPYING' for more information
*/
+#include <cstdio>
+#include <cassert>
+
#include "sp-object.h"
#include "object-hierarchy.h"
@@ -32,7 +35,7 @@ void ObjectHierarchy::clear() {
}
void ObjectHierarchy::setTop(SPObject *object) {
- g_return_if_fail(object != NULL);
+ if (object == NULL) { printf("Assertion object != NULL failed\n"); return; }
if ( top() == object ) {
return;
@@ -53,8 +56,8 @@ void ObjectHierarchy::setTop(SPObject *object) {
}
void ObjectHierarchy::_addTop(SPObject *senior, SPObject *junior) {
- g_assert(junior != NULL);
- g_assert(senior != NULL);
+ assert(junior != NULL);
+ assert(senior != NULL);
SPObject *object = junior->parent;
do {
@@ -64,7 +67,7 @@ void ObjectHierarchy::_addTop(SPObject *senior, SPObject *junior) {
}
void ObjectHierarchy::_addTop(SPObject *object) {
- g_assert(object != NULL);
+ assert(object != NULL);
_hierarchy.push_back(_attach(object));
_added_signal.emit(object);
}
@@ -82,7 +85,7 @@ void ObjectHierarchy::_trimAbove(SPObject *limit) {
}
void ObjectHierarchy::setBottom(SPObject *object) {
- g_return_if_fail(object != NULL);
+ if (object == NULL) { printf("assertion object != NULL failed\n"); return; }
if ( bottom() == object ) {
return;
@@ -125,8 +128,8 @@ void ObjectHierarchy::_trimBelow(SPObject *limit) {
}
void ObjectHierarchy::_addBottom(SPObject *senior, SPObject *junior) {
- g_assert(junior != NULL);
- g_assert(senior != NULL);
+ assert(junior != NULL);
+ assert(senior != NULL);
if ( junior != senior ) {
_addBottom(senior, junior->parent);
@@ -135,15 +138,15 @@ void ObjectHierarchy::_addBottom(SPObject *senior, SPObject *junior) {
}
void ObjectHierarchy::_addBottom(SPObject *object) {
- g_assert(object != NULL);
+ assert(object != NULL);
_hierarchy.push_front(_attach(object));
_added_signal.emit(object);
}
void ObjectHierarchy::_trim_for_release(SPObject *object) {
this->_trimBelow(object);
- g_assert(!this->_hierarchy.empty());
- g_assert(this->_hierarchy.front().object == object);
+ assert(!this->_hierarchy.empty());
+ assert(this->_hierarchy.front().object == object);
sp_object_ref(object, NULL);
this->_detach(this->_hierarchy.front());
diff --git a/src/object-hierarchy.h b/src/object-hierarchy.h
index 0343d850e..16004c81a 100644
--- a/src/object-hierarchy.h
+++ b/src/object-hierarchy.h
@@ -10,12 +10,11 @@
#ifndef SEEN_INKSCAPE_OBJECT_HIERARCHY_H
#define SEEN_INKSCAPE_OBJECT_HIERARCHY_H
+#include <cstddef>
#include <exception>
#include <list>
-#include <stddef.h>
#include <sigc++/connection.h>
#include <sigc++/signal.h>
-#include <glib.h>
class SPObject;
diff --git a/src/path-chemistry.cpp b/src/path-chemistry.cpp
index 9456135f7..0c3f9cde7 100644
--- a/src/path-chemistry.cpp
+++ b/src/path-chemistry.cpp
@@ -22,6 +22,7 @@
#include "xml/repr.h"
#include "svg/svg.h"
#include "display/curve.h"
+#include "color.h"
#include <glib.h>
#include <glibmm/i18n.h>
#include "sp-path.h"
@@ -439,6 +440,10 @@ sp_item_list_to_curves(const GSList *items, GSList **selected, GSList **to_selec
gchar *title = item->title();
// remember description
gchar *desc = item->desc();
+ // remember highlight color
+ guint32 highlight_color = 0;
+ if (item->isHighlightSet())
+ highlight_color = item->highlight_color();
// It's going to resurrect, so we delete without notifying listeners.
item->deleteObject(false);
@@ -456,6 +461,9 @@ sp_item_list_to_curves(const GSList *items, GSList **selected, GSList **to_selec
newObj->setDesc(desc);
g_free(desc);
}
+ if (highlight_color && newObj) {
+ SP_ITEM(newObj)->setHighlightColor( highlight_color );
+ }
// move to the saved position
repr->setPosition(pos > 0 ? pos : 0);
diff --git a/src/path-chemistry.h b/src/path-chemistry.h
index efc687b44..a2150440c 100644
--- a/src/path-chemistry.h
+++ b/src/path-chemistry.h
@@ -13,8 +13,6 @@
* Released under GNU GPL, read the file 'COPYING' for more information
*/
-#include <glib.h>
-
class SPDesktop;
class SPItem;
@@ -25,6 +23,9 @@ class Node;
} // namespace XML
} // namespace Inkscape
+typedef unsigned int guint32;
+typedef struct _GSList GSList;
+
void sp_selected_path_combine (SPDesktop *desktop);
void sp_selected_path_break_apart (SPDesktop *desktop);
// interactive=true only has an effect if desktop != NULL, i.e. if a GUI is available
diff --git a/src/path-prefix.h b/src/path-prefix.h
index 4c31b629c..7042d5124 100644
--- a/src/path-prefix.h
+++ b/src/path-prefix.h
@@ -10,15 +10,15 @@
* define'd directories, and instead should use only the paths defined here.
*
*/
-#ifndef _PATH_PREFIX_H_
-#define _PATH_PREFIX_H_
+#ifndef SEEN_PATH_PREFIX_H
+#define SEEN_PATH_PREFIX_H
#include "require-config.h" // INKSCAPE_DATADIR
#include "prefix.h"
-#ifdef __cplusplus
-extern "C" {
-#endif /* __cplusplus */
+//#ifdef __cplusplus
+//extern "C" {
+//#endif /* __cplusplus */
#ifdef ENABLE_BINRELOC
# define INKSCAPE_APPICONDIR BR_DATADIR( "/pixmaps" )
@@ -112,8 +112,8 @@ extern "C" {
# endif
#endif
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
+//#ifdef __cplusplus
+//}
+//#endif /* __cplusplus */
#endif /* _PATH_PREFIX_H_ */
diff --git a/src/persp3d-reference.h b/src/persp3d-reference.h
index fa9eca5c9..cce497d94 100644
--- a/src/persp3d-reference.h
+++ b/src/persp3d-reference.h
@@ -10,9 +10,10 @@
* Released under GNU GPL, read the file 'COPYING' for more information.
*/
-#include "uri-references.h"
-#include <stddef.h>
+#include <cstddef>
#include <sigc++/sigc++.h>
+
+#include "uri-references.h"
#include "persp3d.h"
class SPObject;
@@ -35,7 +36,7 @@ public:
SPObject *owner;
// concerning the Persp3D (we only use SPBox3D) that is refered to:
- gchar *persp_href;
+ char *persp_href;
Inkscape::XML::Node *persp_repr;
Persp3D *persp;
diff --git a/src/persp3d.h b/src/persp3d.h
index bd3777a19..be5680bcb 100644
--- a/src/persp3d.h
+++ b/src/persp3d.h
@@ -1,5 +1,5 @@
-#ifndef __PERSP3D_H__
-#define __PERSP3D_H__
+#ifndef SEEN_PERSP3D_H
+#define SEEN_PERSP3D_H
/*
* Implementation of 3D perspectives as SPObjects
@@ -16,8 +16,9 @@
#define SP_IS_PERSP3D(obj) (dynamic_cast<const Persp3D*>((SPObject*)obj) != NULL)
#include <list>
-#include <vector>
#include <map>
+#include <vector>
+
#include "transf_mat_3x4.h"
#include "document.h"
#include "inkscape.h" // for SP_ACTIVE_DOCUMENT
@@ -64,11 +65,11 @@ protected:
virtual void build(SPDocument* doc, Inkscape::XML::Node* repr);
virtual void release();
- virtual void set(unsigned int key, const gchar* value);
+ virtual void set(unsigned int key, char const* value);
virtual void update(SPCtx* ctx, unsigned int flags);
- virtual Inkscape::XML::Node* write(Inkscape::XML::Document* doc, Inkscape::XML::Node* repr, guint flags);
+ virtual Inkscape::XML::Node* write(Inkscape::XML::Document* doc, Inkscape::XML::Node* repr, unsigned int flags);
};
@@ -100,7 +101,7 @@ void persp3d_update_z_orders (Persp3D *persp);
inline unsigned int persp3d_num_boxes (Persp3D *persp) { return persp->perspective_impl->boxes.size(); }
std::list<SPBox3D *> persp3d_list_of_boxes(Persp3D *persp);
-bool persp3d_perspectives_coincide(const Persp3D *lhs, const Persp3D *rhs);
+bool persp3d_perspectives_coincide(Persp3D const *lhs, Persp3D const *rhs);
void persp3d_absorb(Persp3D *persp1, Persp3D *persp2);
Persp3D * persp3d_create_xml_element (SPDocument *document, Persp3DImpl *dup = NULL);
@@ -112,7 +113,7 @@ void persp3d_print_debugging_info (Persp3D *persp);
void persp3d_print_debugging_info_all(SPDocument *doc);
void persp3d_print_all_selected();
-void print_current_persp3d(gchar *func_name, Persp3D *persp);
+void print_current_persp3d(char *func_name, Persp3D *persp);
#endif /* __PERSP3D_H__ */
diff --git a/src/perspective-line.cpp b/src/perspective-line.cpp
index 4fd68f8ed..e6c78403b 100644
--- a/src/perspective-line.cpp
+++ b/src/perspective-line.cpp
@@ -1,6 +1,4 @@
-#define __PERSPECTIVE_LINE_C__
-
-/*
+/**
* Perspective line for 3D perspectives
*
* Authors:
@@ -40,4 +38,4 @@ PerspectiveLine::PerspectiveLine (Geom::Point const &pt, Proj::Axis const axis,
fill-column:99
End:
*/
-// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8 :
diff --git a/src/perspective-line.h b/src/perspective-line.h
index 57abaae9c..64f7d03bd 100644
--- a/src/perspective-line.h
+++ b/src/perspective-line.h
@@ -13,7 +13,6 @@
#define SEEN_PERSPECTIVE_LINE_H
#include "line-geometry.h"
-#include <glib.h>
class SPDesktop;
diff --git a/src/preferences-skeleton.h b/src/preferences-skeleton.h
index 734e8a582..66a3e47d4 100644
--- a/src/preferences-skeleton.h
+++ b/src/preferences-skeleton.h
@@ -1,8 +1,9 @@
#ifndef SEEN_PREFERENCES_SKELETON_H
#define SEEN_PREFERENCES_SKELETON_H
-#include <inkscape-version.h>
+#include "inkscape-version.h"
+// FIXME why is this here?
#ifdef N_
#undef N_
#endif
diff --git a/src/preferences.h b/src/preferences.h
index d5429815e..d5ae40e56 100644
--- a/src/preferences.h
+++ b/src/preferences.h
@@ -13,14 +13,16 @@
#ifndef INKSCAPE_PREFSTORE_H
#define INKSCAPE_PREFSTORE_H
-#include <map>
-#include <vector>
#include <climits>
#include <cfloat>
#include <glibmm/ustring.h>
+#include <map>
+#include <vector>
+
#include "xml/repr.h"
class SPCSSAttr;
+typedef unsigned int guint32;
namespace Inkscape {
diff --git a/src/prefix.cpp b/src/prefix.cpp
index dd8872a1d..6bf5cb2cf 100644
--- a/src/prefix.cpp
+++ b/src/prefix.cpp
@@ -44,12 +44,6 @@ extern "C" {
#endif /* __cplusplus */
- // Why is NULL being redefined?! This breaks compilation on Windows, as it disables the safe assignment of NULL to other pointer types.
-#ifndef __WIN32__
-# undef NULL
-# define NULL ((void *) 0)
-#endif
-
#ifdef __GNUC__
#define br_return_val_if_fail(expr,val) if (!(expr)) {fprintf (stderr, "** BinReloc (%s): assertion %s failed\n", __PRETTY_FUNCTION__, #expr); return val;}
#else
diff --git a/src/print.h b/src/print.h
index bbf95b833..ab2bcc0a7 100644
--- a/src/print.h
+++ b/src/print.h
@@ -41,18 +41,18 @@ unsigned int sp_print_stroke(SPPrintContext *ctx, Geom::PathVector const &pathv,
Geom::OptRect const &pbox, Geom::OptRect const &dbox, Geom::OptRect const &bbox);
unsigned int sp_print_image_R8G8B8A8_N(SPPrintContext *ctx,
- guchar *px, unsigned int w, unsigned int h, unsigned int rs,
+ unsigned char *px, unsigned int w, unsigned int h, unsigned int rs,
Geom::Affine const &transform, SPStyle const *style);
unsigned int sp_print_text(SPPrintContext *ctx, char const *text, Geom::Point p,
SPStyle const *style);
-void sp_print_get_param(SPPrintContext *ctx, gchar *name, bool *value);
+void sp_print_get_param(SPPrintContext *ctx, char *name, bool *value);
/* UI */
void sp_print_document(Gtk::Window& parentWindow, SPDocument *doc);
-void sp_print_document_to_file(SPDocument *doc, gchar const *filename);
+void sp_print_document_to_file(SPDocument *doc, char const *filename);
#endif /* !PRINT_H_INKSCAPE */
diff --git a/src/profile-manager.h b/src/profile-manager.h
index be9446c17..54cd4a1da 100644
--- a/src/profile-manager.h
+++ b/src/profile-manager.h
@@ -9,9 +9,10 @@
#ifndef SEEN_INKSCAPE_PROFILE_MANAGER_H
#define SEEN_INKSCAPE_PROFILE_MANAGER_H
+#include <vector>
+
#include "document-subset.h"
#include "gc-finalized.h"
-#include <vector>
class SPDocument;
@@ -26,7 +27,7 @@ public:
ProfileManager(SPDocument *document);
~ProfileManager();
- ColorProfile* find(gchar const* name);
+ ColorProfile* find(char const* name);
private:
ProfileManager(ProfileManager const &); // no copy
diff --git a/src/proj_pt.cpp b/src/proj_pt.cpp
index 28286948d..311b9a034 100644
--- a/src/proj_pt.cpp
+++ b/src/proj_pt.cpp
@@ -1,6 +1,4 @@
-#define __PROJ_PT_C__
-
-/*
+/**
* 3x4 transformation matrix to map points from projective 3-space into the projective plane
*
* Authors:
@@ -11,12 +9,14 @@
* Released under GNU GPL, read the file 'COPYING' for more information
*/
+#include <glib.h>
+
#include "proj_pt.h"
#include "svg/stringstream.h"
namespace Proj {
-Pt2::Pt2(const gchar *coord_str) {
+Pt2::Pt2(const char *coord_str) {
if (!coord_str) {
pt[0] = 0.0;
pt[1] = 0.0;
@@ -24,7 +24,7 @@ Pt2::Pt2(const gchar *coord_str) {
g_warning ("Coordinate string is empty. Creating default Pt2\n");
return;
}
- gchar **coords = g_strsplit(coord_str, ":", 0);
+ char **coords = g_strsplit(coord_str, ":", 0);
if (coords[0] == NULL || coords[1] == NULL || coords[2] == NULL) {
g_strfreev (coords);
g_warning ("Malformed coordinate string.\n");
@@ -54,7 +54,7 @@ Pt2::affine() {
return Geom::Point (pt[0]/pt[2], pt[1]/pt[2]);
}
-gchar *
+char *
Pt2::coord_string() {
Inkscape::SVGOStringStream os;
os << pt[0] << " : "
@@ -63,7 +63,7 @@ Pt2::coord_string() {
return g_strdup(os.str().c_str());
}
-Pt3::Pt3(const gchar *coord_str) {
+Pt3::Pt3(const char *coord_str) {
if (!coord_str) {
pt[0] = 0.0;
pt[1] = 0.0;
@@ -72,7 +72,7 @@ Pt3::Pt3(const gchar *coord_str) {
g_warning ("Coordinate string is empty. Creating default Pt2\n");
return;
}
- gchar **coords = g_strsplit(coord_str, ":", 0);
+ char **coords = g_strsplit(coord_str, ":", 0);
if (coords[0] == NULL || coords[1] == NULL ||
coords[2] == NULL || coords[3] == NULL) {
g_strfreev (coords);
@@ -96,7 +96,7 @@ Pt3::normalize() {
pt[3] = 1.0;
}
-gchar *
+char *
Pt3::coord_string() {
Inkscape::SVGOStringStream os;
os << pt[0] << " : "
@@ -117,4 +117,4 @@ Pt3::coord_string() {
fill-column:99
End:
*/
-// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8 :
diff --git a/src/proj_pt.h b/src/proj_pt.h
index 90b9df201..1ee4b7f14 100644
--- a/src/proj_pt.h
+++ b/src/proj_pt.h
@@ -1,7 +1,4 @@
-#ifndef __PROJ_PT_H__
-#define __PROJ_PT_H__
-
-/*
+/**
* 3x4 transformation matrix to map points from projective 3-space into the projective plane
*
* Authors:
@@ -12,8 +9,11 @@
* Released under GNU GPL, read the file 'COPYING' for more information
*/
+#ifndef SEEN_PROJ_PT_H
+#define SEEN_PROJ_PT_H
+
#include <2geom/point.h>
-#include <gtk/gtk.h>
+#include <cstdio>
namespace Proj {
@@ -25,7 +25,7 @@ public:
Pt2 () { pt[0] = 0; pt[1] = 0; pt[2] = 1.0; } // we default to (0 : 0 : 1)
Pt2 (double x, double y, double w) { pt[0] = x; pt[1] = y; pt[2] = w; }
Pt2 (Geom::Point const &point) { pt[0] = point[Geom::X]; pt[1] = point[Geom::Y]; pt[2] = 1; }
- Pt2 (const gchar *coord_str);
+ Pt2 (const char *coord_str);
inline double operator[] (unsigned int index) const {
if (index > 2) { return Geom::infinity(); }
@@ -81,8 +81,8 @@ public:
void normalize();
Geom::Point affine();
inline bool is_finite() { return pt[2] != 0; } // FIXME: Should we allow for some tolerance?
- gchar *coord_string();
- inline void print(gchar const *s) const { g_print ("%s(%8.2f : %8.2f : %8.2f)\n", s, pt[0], pt[1], pt[2]); }
+ char *coord_string();
+ inline void print(char const *s) const { printf ("%s(%8.2f : %8.2f : %8.2f)\n", s, pt[0], pt[1], pt[2]); }
private:
double pt[3];
@@ -93,7 +93,7 @@ class Pt3 {
public:
Pt3 () { pt[0] = 0; pt[1] = 0; pt[2] = 0; pt[3] = 1.0; } // we default to (0 : 0 : 0 : 1)
Pt3 (double x, double y, double z, double w) { pt[0] = x; pt[1] = y; pt[2] = z; pt[3] = w; }
- Pt3 (const gchar *coord_str);
+ Pt3 (const char *coord_str);
inline bool operator== (Pt3 &rhs) {
normalize();
@@ -146,9 +146,9 @@ public:
}
void normalize();
inline bool is_finite() { return pt[3] != 0; } // FIXME: Should we allow for some tolerance?
- gchar *coord_string();
- inline void print(gchar const *s) const {
- g_print ("%s(%8.2f : %8.2f : %8.2f : %8.2f)\n", s, pt[0], pt[1], pt[2], pt[3]);
+ char *coord_string();
+ inline void print(char const *s) const {
+ printf ("%s(%8.2f : %8.2f : %8.2f : %8.2f)\n", s, pt[0], pt[1], pt[2], pt[3]);
}
private:
@@ -157,7 +157,7 @@ private:
} // namespace Proj
-#endif /* __PROJ_PT_H__ */
+#endif // !SEEN_PROJ_PT_H
/*
Local Variables:
@@ -168,4 +168,4 @@ private:
fill-column:99
End:
*/
-// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8 :
diff --git a/src/rdf.h b/src/rdf.h
index 3dde1cb48..c3ced1583 100644
--- a/src/rdf.h
+++ b/src/rdf.h
@@ -11,7 +11,6 @@
#ifndef SEEN_RDF_H
#define SEEN_RDF_H
-#include <glib.h>
#include <glibmm/i18n.h>
#include "document.h"
@@ -22,18 +21,18 @@
* \brief Holds license name/resource doubles for rdf_license_t entries
*/
struct rdf_double_t {
- gchar const *name;
- gchar const *resource;
+ char const *name;
+ char const *resource;
};
/**
* \brief Holds license name and RDF information
*/
struct rdf_license_t {
- gchar const *name; /* localized name of this license */
- gchar const *uri; /* URL for the RDF/Work/license element */
+ char const *name; /* localized name of this license */
+ char const *uri; /* URL for the RDF/Work/license element */
struct rdf_double_t *details; /* the license details */
-// gchar const *fragment; /* XML contents for the RDF/License tag */
+// char const *fragment; /* XML contents for the RDF/License tag */
};
extern rdf_license_t rdf_licenses [];
@@ -69,10 +68,10 @@ enum RDF_Editable {
*/
struct rdf_work_entity_t {
char const *name; /* unique name of this entity for internal reference */
- gchar const *title; /* localized title of this entity for data entry */
- gchar const *tag; /* namespace tag for the RDF/Work element */
+ char const *title; /* localized title of this entity for data entry */
+ char const *tag; /* namespace tag for the RDF/Work element */
RDFType datatype; /* how to extract/inject the RDF information */
- gchar const *tip; /* tool tip to explain the meaning of the entity */
+ char const *tip; /* tool tip to explain the meaning of the entity */
RDF_Format format; /* in what format is this data edited? */
RDF_Editable editable;/* in what way is the data editable? */
};
@@ -83,19 +82,19 @@ extern rdf_work_entity_t rdf_work_entities [];
* \brief Generic collection of RDF information for the RDF debug function
*/
struct rdf_t {
- gchar* work_title;
- gchar* work_date;
- gchar* work_creator;
- gchar* work_owner;
- gchar* work_publisher;
- gchar* work_type;
- gchar* work_source;
- gchar* work_subject;
- gchar* work_description;
+ char* work_title;
+ char* work_date;
+ char* work_creator;
+ char* work_owner;
+ char* work_publisher;
+ char* work_type;
+ char* work_source;
+ char* work_subject;
+ char* work_description;
struct rdf_license_t* license;
};
-struct rdf_work_entity_t * rdf_find_entity(gchar const * name);
+struct rdf_work_entity_t * rdf_find_entity(char const * name);
/**
* \brief Retrieves a known RDF/Work entity's contents from the document XML by name
@@ -114,7 +113,7 @@ const gchar * rdf_get_work_entity(SPDocument const * doc,
*/
unsigned int rdf_set_work_entity(SPDocument * doc,
struct rdf_work_entity_t * entity,
- const gchar * text);
+ const char * text);
/**
* \brief Attempts to match and retrieve a known RDF/License from the document XML
diff --git a/src/removeoverlap.h b/src/removeoverlap.h
index 1ba41572a..7109c9513 100644
--- a/src/removeoverlap.h
+++ b/src/removeoverlap.h
@@ -13,7 +13,7 @@
#ifndef SEEN_REMOVEOVERLAP_H
#define SEEN_REMOVEOVERLAP_H
-#include <glib.h>
+typedef struct _GSList GSList;
void removeoverlap(GSList const *items, double xGap, double yGap);
diff --git a/src/rubberband.h b/src/rubberband.h
index fbebe2b08..a7bc57145 100644
--- a/src/rubberband.h
+++ b/src/rubberband.h
@@ -10,17 +10,17 @@
* Released under GNU GPL, read the file 'COPYING' for more information
*/
-#include <boost/optional.hpp>
-#include <vector>
#include <2geom/point.h>
#include <2geom/rect.h>
+#include <boost/optional.hpp>
+#include <vector>
/* fixme: do multidocument safe */
-class CtrlRect;
+class CtrlRect;
+class SPCurve;
+class SPDesktop;
struct SPCanvasItem;
-class SPCurve;
-class SPDesktop;
enum {
RUBBERBAND_MODE_RECT,
diff --git a/src/satisfied-guide-cns.h b/src/satisfied-guide-cns.h
index 73e1e7e7f..25e5919d0 100644
--- a/src/satisfied-guide-cns.h
+++ b/src/satisfied-guide-cns.h
@@ -3,7 +3,7 @@
#include <2geom/forward.h>
#include <vector>
-#include <sp-item.h>
+#include "sp-item.h"
class SPDesktop;
class SPGuideConstraint;
diff --git a/src/selcue.h b/src/selcue.h
index bcac7315f..d9b16b0f5 100644
--- a/src/selcue.h
+++ b/src/selcue.h
@@ -1,5 +1,5 @@
-#ifndef __SP_SELCUE_H__
-#define __SP_SELCUE_H__
+#ifndef SEEN_SP_SELCUE_H
+#define SEEN_SP_SELCUE_H
/*
* Helper object for showing selected items
@@ -13,8 +13,8 @@
* Released under GNU GPL, read the file 'COPYING' for more information
*/
+#include <cstddef>
#include <list>
-#include <stddef.h>
#include <sigc++/sigc++.h>
class SPDesktop;
@@ -52,7 +52,7 @@ private:
void _updateItemBboxes();
void _updateItemBboxes(Inkscape::Preferences *prefs);
- void _updateItemBboxes(gint mode, int prefs_bbox);
+ void _updateItemBboxes(int mode, int prefs_bbox);
void _newItemBboxes();
void _newTextBaselines();
void _boundingBoxPrefsChanged(int prefs_bbox);
diff --git a/src/selection-chemistry.cpp b/src/selection-chemistry.cpp
index dd91a5fa0..6a091bd12 100644
--- a/src/selection-chemistry.cpp
+++ b/src/selection-chemistry.cpp
@@ -37,11 +37,11 @@ SPCycleType SP_CYCLING = SP_CYCLE_FOCUS;
#include "dir-util.h"
#include "layer-model.h"
#include "selection.h"
-#include "tools-switch.h"
+#include "ui/tools-switch.h"
#include "desktop-handles.h"
#include "message-stack.h"
#include "sp-item-transform.h"
-#include "marker.h"
+#include "sp-marker.h"
#include "sp-use.h"
#include "sp-textpath.h"
#include "sp-tspan.h"
@@ -112,7 +112,7 @@ SPCycleType SP_CYCLING = SP_CYCLE_FOCUS;
#include "sp-item-group.h"
// For clippath editing
-#include "tools-switch.h"
+#include "ui/tools-switch.h"
#include "ui/tools/node-tool.h"
#include "ui/clipboard.h"
@@ -2881,55 +2881,52 @@ void sp_selection_clone_original_path_lpe(SPDesktop *desktop)
if (desktop == NULL) {
return;
}
-
- Inkscape::Selection *selection = sp_desktop_selection(desktop);
- SPItem *item = selection->singleItem();
- if (g_slist_length(const_cast<GSList *>(selection->itemList())) != 1 || !item) {
- desktop->messageStack()->flash(Inkscape::WARNING_MESSAGE, _("Select <b>one</b> path to clone."));
- return;
- }
- if ( !(dynamic_cast<SPShape *>(item) || dynamic_cast<SPText *>(item)) ) {
- desktop->messageStack()->flash(Inkscape::WARNING_MESSAGE, _("Select one <b>path</b> to clone."));
- return;
- }
-
- Inkscape::XML::Document *xml_doc = desktop->doc()->getReprDoc();
- Inkscape::XML::Node *parent = item->getRepr()->parent();
-
- // create the LPE
- Inkscape::XML::Node *lpe_repr = xml_doc->createElement("inkscape:path-effect");
- {
- lpe_repr->setAttribute("effect", "clone_original");
- gchar *href = g_strdup_printf("#%s", item->getRepr()->attribute("id"));
- lpe_repr->setAttribute("linkedpath", href);
- g_free(href);
- desktop->doc()->getDefs()->getRepr()->addChild(lpe_repr, NULL); // adds to <defs> and assigns the 'id' attribute
- }
- const gchar * lpe_id = lpe_repr->attribute("id");
- Inkscape::GC::release(lpe_repr);
-
- // create the new path
- Inkscape::XML::Node *clone = xml_doc->createElement("svg:path");
- {
- clone->setAttribute("d", "M 0 0", false);
- // add the new clone to the top of the original's parent
- parent->appendChild(clone);
- SPObject *clone_obj = desktop->doc()->getObjectById(clone->attribute("id"));
- SPLPEItem *clone_lpe = dynamic_cast<SPLPEItem *>(clone_obj);
- if (clone_lpe) {
- gchar *href = g_strdup_printf("#%s", lpe_id);
- clone_lpe->addPathEffect( href, false );
- g_free(href);
+
+ Inkscape::SVGOStringStream os;
+ SPObject * firstItem = NULL;
+ for (const GSList * item = desktop->selection->itemList(); item != NULL; item = item->next) {
+ if (SP_IS_SHAPE(item->data) || SP_IS_TEXT(item->data)) {
+ if (firstItem) {
+ os << "|";
+ } else {
+ firstItem = SP_ITEM(item->data);
+ }
+ os << "#" << SP_ITEM(item->data)->getId() << ",0";
}
}
+ if (firstItem) {
+ Inkscape::XML::Document *xml_doc = desktop->doc()->getReprDoc();
+ SPObject *parent = firstItem->parent;
- DocumentUndo::done(sp_desktop_document(desktop), SP_VERB_EDIT_CLONE_ORIGINAL_PATH_LPE,
- _("Clone original path"));
+ // create the LPE
+ Inkscape::XML::Node *lpe_repr = xml_doc->createElement("inkscape:path-effect");
+ {
+ lpe_repr->setAttribute("effect", "fill_between_many");
+ lpe_repr->setAttribute("linkedpaths", os.str().c_str());
+ desktop->doc()->getDefs()->getRepr()->addChild(lpe_repr, NULL); // adds to <defs> and assigns the 'id' attribute
+ }
+ const gchar * lpe_id = lpe_repr->attribute("id");
+ Inkscape::GC::release(lpe_repr);
- // select the new object:
- selection->set(clone);
+ // create the new path
+ Inkscape::XML::Node *clone = xml_doc->createElement("svg:path");
+ {
+ clone->setAttribute("d", "M 0 0", false);
+ // add the new clone to the top of the original's parent
+ parent->appendChildRepr(clone);
+ SPObject *clone_obj = desktop->doc()->getObjectById(clone->attribute("id"));
+ SPLPEItem *clone_lpeitem = dynamic_cast<SPLPEItem *>(clone_obj);
+ if (clone_lpeitem) {
+ gchar *href = g_strdup_printf("#%s", lpe_id);
+ clone_lpeitem->addPathEffect(href, false);
+ g_free(href);
+ }
+ }
- Inkscape::GC::release(clone);
+ DocumentUndo::done(sp_desktop_document(desktop), SP_VERB_EDIT_CLONE_ORIGINAL_PATH_LPE, _("Fill between many"));
+ } else {
+ desktop->messageStack()->flash(Inkscape::WARNING_MESSAGE, _("Select path(s) to fill."));
+ }
}
void sp_selection_to_marker(SPDesktop *desktop, bool apply)
@@ -3785,6 +3782,118 @@ void sp_selection_create_bitmap_copy(SPDesktop *desktop)
g_free(filepath);
}
+/* Creates a mask or clipPath from selection.
+ * What is a clip group?
+ * A clip group is a tangled mess of XML that allows an object inside a group
+ * to clip the entire group using a few <use>s and generally irritating me.
+ */
+
+void sp_selection_set_clipgroup(SPDesktop *desktop)
+{
+ if (desktop == NULL) {
+ return;
+ }
+ SPDocument* doc = sp_desktop_document(desktop);
+ Inkscape::XML::Document *xml_doc = doc->getReprDoc();
+
+ Inkscape::Selection *selection = sp_desktop_selection(desktop);
+ if (selection->isEmpty()) {
+ desktop->messageStack()->flash(Inkscape::WARNING_MESSAGE, _("Select <b>object(s)</b> to create clippath or mask from."));
+ return;
+ }
+
+ GSList const *l = const_cast<GSList *>(selection->reprList());
+
+ GSList *p = g_slist_copy(const_cast<GSList *>(l));
+
+ p = g_slist_sort(p, (GCompareFunc) sp_repr_compare_position);
+
+ selection->clear();
+
+ gint topmost = (static_cast<Inkscape::XML::Node *>(g_slist_last(p)->data))->position();
+ Inkscape::XML::Node *topmost_parent = (static_cast<Inkscape::XML::Node *>(g_slist_last(p)->data))->parent();
+
+ Inkscape::XML::Node *inner = xml_doc->createElement("svg:g");
+ inner->setAttribute("inkscape:label", "Clip");
+
+ while (p) {
+ Inkscape::XML::Node *current = static_cast<Inkscape::XML::Node *>(p->data);
+
+ if (current->parent() == topmost_parent) {
+ Inkscape::XML::Node *spnew = current->duplicate(xml_doc);
+ sp_repr_unparent(current);
+ inner->appendChild(spnew);
+ Inkscape::GC::release(spnew);
+ topmost --; // only reduce count for those items deleted from topmost_parent
+ } else { // move it to topmost_parent first
+ GSList *temp_clip = NULL;
+
+ // At this point, current may already have no item, due to its being a clone whose original is already moved away
+ // So we copy it artificially calculating the transform from its repr->attr("transform") and the parent transform
+ gchar const *t_str = current->attribute("transform");
+ Geom::Affine item_t(Geom::identity());
+ if (t_str)
+ sp_svg_transform_read(t_str, &item_t);
+ item_t *= SP_ITEM(doc->getObjectByRepr(current->parent()))->i2doc_affine();
+ // FIXME: when moving both clone and original from a transformed group (either by
+ // grouping into another parent, or by cut/paste) the transform from the original's
+ // parent becomes embedded into original itself, and this affects its clones. Fix
+ // this by remembering the transform diffs we write to each item into an array and
+ // then, if this is clone, looking up its original in that array and pre-multiplying
+ // it by the inverse of that original's transform diff.
+
+ sp_selection_copy_one(current, item_t, &temp_clip, xml_doc);
+ sp_repr_unparent(current);
+
+ // paste into topmost_parent (temporarily)
+ GSList *copied = sp_selection_paste_impl(doc, doc->getObjectByRepr(topmost_parent), &temp_clip);
+ if (temp_clip) g_slist_free(temp_clip);
+ if (copied) { // if success,
+ // take pasted object (now in topmost_parent)
+ Inkscape::XML::Node *in_topmost = static_cast<Inkscape::XML::Node *>(copied->data);
+ // make a copy
+ Inkscape::XML::Node *spnew = in_topmost->duplicate(xml_doc);
+ // remove pasted
+ sp_repr_unparent(in_topmost);
+ // put its copy into group
+ inner->appendChild(spnew);
+ Inkscape::GC::release(spnew);
+ g_slist_free(copied);
+ }
+ }
+ p = g_slist_remove(p, current);
+ }
+
+ Inkscape::XML::Node *outer = xml_doc->createElement("svg:g");
+ outer->appendChild(inner);
+ topmost_parent->appendChild(outer);
+ outer->setPosition(topmost + 1);
+
+ Inkscape::XML::Node *clone = xml_doc->createElement("svg:use");
+ clone->setAttribute("x", "0", false);
+ clone->setAttribute("y", "0", false);
+ clone->setAttribute("xlink:href", g_strdup_printf("#%s", inner->attribute("id")), false);
+
+ clone->setAttribute("inkscape:transform-center-x", inner->attribute("inkscape:transform-center-x"), false);
+ clone->setAttribute("inkscape:transform-center-y", inner->attribute("inkscape:transform-center-y"), false);
+
+ const Geom::Affine maskTransform(Geom::Affine::identity());
+ GSList *templist = NULL;
+
+ templist = g_slist_append(templist, clone);
+ // add the new clone to the top of the original's parent
+ gchar const *mask_id = SPClipPath::create(templist, doc, &maskTransform);
+
+ g_slist_free(templist);
+
+ outer->setAttribute("clip-path", g_strdup_printf("url(#%s)", mask_id));
+
+ Inkscape::GC::release(clone);
+
+ selection->set(outer);
+ DocumentUndo::done(doc, SP_VERB_OBJECT_SET_CLIPPATH, _("Create Clip Group"));
+}
+
/**
* Creates a mask or clipPath from selection.
* Two different modes:
@@ -4074,6 +4183,10 @@ void sp_selection_unset_mask(SPDesktop *desktop, bool apply_clip_path) {
for ( SPObject *child = obj->firstChild() ; child; child = child->getNext() ) {
// Collect all clipped paths and masks within a single group
Inkscape::XML::Node *copy = SP_OBJECT(child)->getRepr()->duplicate(xml_doc);
+ if(copy->attribute("inkscape:original-d"))
+ {
+ copy->setAttribute("d", copy->attribute("inkscape:original-d"));
+ }
items_to_move = g_slist_prepend(items_to_move, copy);
}
diff --git a/src/selection-chemistry.h b/src/selection-chemistry.h
index 01c35d65a..d86906548 100644
--- a/src/selection-chemistry.h
+++ b/src/selection-chemistry.h
@@ -17,21 +17,21 @@
* Released under GNU GPL, read the file 'COPYING' for more information
*/
+#include <2geom/forward.h>
#include "sp-item.h"
-#include "2geom/forward.h"
-namespace Inkscape { class Selection; }
+class SPCSSAttr;
+class SPDesktop;
+typedef struct _GSList GSList;
namespace Inkscape {
+
+class Selection;
+
namespace LivePathEffect {
class PathParam;
}
-}
-class SPCSSAttr;
-class SPDesktop;
-
-namespace Inkscape {
class SelectionHelper {
public:
static void selectAll(SPDesktop *desktop);
@@ -108,21 +108,21 @@ void sp_selection_apply_affine(Inkscape::Selection *selection, Geom::Affine cons
void sp_selection_remove_transform (SPDesktop *desktop);
void sp_selection_scale_absolute (Inkscape::Selection *selection, double x0, double x1, double y0, double y1);
void sp_selection_scale_relative(Inkscape::Selection *selection, Geom::Point const &align, Geom::Scale const &scale);
-void sp_selection_rotate_relative (Inkscape::Selection *selection, Geom::Point const &center, gdouble angle);
+void sp_selection_rotate_relative (Inkscape::Selection *selection, Geom::Point const &center, double angle);
void sp_selection_skew_relative (Inkscape::Selection *selection, Geom::Point const &align, double dx, double dy);
void sp_selection_move_relative (Inkscape::Selection *selection, Geom::Point const &move, bool compensate = true);
void sp_selection_move_relative (Inkscape::Selection *selection, double dx, double dy);
void sp_selection_rotate_90 (SPDesktop *desktop, bool ccw);
-void sp_selection_rotate (Inkscape::Selection *selection, gdouble angle);
-void sp_selection_rotate_screen (Inkscape::Selection *selection, gdouble angle);
+void sp_selection_rotate (Inkscape::Selection *selection, double angle);
+void sp_selection_rotate_screen (Inkscape::Selection *selection, double angle);
-void sp_selection_scale (Inkscape::Selection *selection, gdouble grow);
-void sp_selection_scale_screen (Inkscape::Selection *selection, gdouble grow_pixels);
-void sp_selection_scale_times (Inkscape::Selection *selection, gdouble times);
+void sp_selection_scale (Inkscape::Selection *selection, double grow);
+void sp_selection_scale_screen (Inkscape::Selection *selection, double grow_pixels);
+void sp_selection_scale_times (Inkscape::Selection *selection, double times);
-void sp_selection_move (Inkscape::Selection *selection, gdouble dx, gdouble dy);
-void sp_selection_move_screen (Inkscape::Selection *selection, gdouble dx, gdouble dy);
+void sp_selection_move (Inkscape::Selection *selection, double dx, double dy);
+void sp_selection_move_screen (Inkscape::Selection *selection, double dx, double dy);
void sp_selection_item_next (SPDesktop *desktop);
void sp_selection_item_prev (SPDesktop *desktop);
@@ -156,6 +156,7 @@ void sp_document_get_export_hints (SPDocument * doc, Glib::ustring &filename, fl
void sp_selection_create_bitmap_copy (SPDesktop *desktop);
+void sp_selection_set_clipgroup(SPDesktop *desktop);
void sp_selection_set_mask(SPDesktop *desktop, bool apply_clip_path, bool apply_to_layer);
void sp_selection_unset_mask(SPDesktop *desktop, bool apply_clip_path);
diff --git a/src/selection-describer.h b/src/selection-describer.h
index b4174edd8..5514ce4b1 100644
--- a/src/selection-describer.h
+++ b/src/selection-describer.h
@@ -16,11 +16,10 @@
#include <sigc++/sigc++.h>
#include "message-context.h"
-namespace Inkscape { class Selection; }
-
namespace Inkscape {
class MessageStack;
+class Selection;
class SelectionDescriber : public sigc::trackable {
public:
@@ -29,7 +28,7 @@ public:
private:
void _updateMessageFromSelection(Inkscape::Selection *selection);
- void _selectionModified(Inkscape::Selection *selection, guint /*flags*/);
+ void _selectionModified(Inkscape::Selection *selection, unsigned int /*flags*/);
sigc::connection *_selection_changed_connection;
sigc::connection *_selection_modified_connection;
@@ -43,6 +42,7 @@ private:
}
#endif
+
/*
Local Variables:
mode:c++
diff --git a/src/selection.h b/src/selection.h
index ba38bec08..5964b20e8 100644
--- a/src/selection.h
+++ b/src/selection.h
@@ -30,6 +30,7 @@ class SPDesktop;
class SPItem;
class SPBox3D;
class Persp3D;
+typedef struct _GSList GSList;
namespace Inkscape {
class LayerModel;
@@ -256,10 +257,10 @@ public:
std::list<SPBox3D *> const box3DList(Persp3D *persp = NULL);
/** Returns the number of layers in which there are selected objects. */
- guint numberOfLayers();
+ unsigned int numberOfLayers();
/** Returns the number of parents to which the selected objects belong. */
- guint numberOfParents();
+ unsigned int numberOfParents();
/** Returns the bounding rectangle of the selection. */
Geom::OptRect bounds(SPItem::BBoxType type) const;
@@ -317,11 +318,11 @@ public:
* @return the resulting connection
*
*/
- sigc::connection connectModified(sigc::slot<void, Selection *, guint> const &slot)
+ sigc::connection connectModified(sigc::slot<void, Selection *, unsigned int> const &slot)
{
return _modified_signal.connect(slot);
}
- sigc::connection connectModifiedFirst(sigc::slot<void, Selection *, guint> const &slot)
+ sigc::connection connectModifiedFirst(sigc::slot<void, Selection *, unsigned int> const &slot)
{
return _modified_signal.slots().insert(_modified_signal.slots().begin(), slot);
}
@@ -333,12 +334,12 @@ private:
void operator=(Selection const &);
/** Issues modification notification signals. */
- static gboolean _emit_modified(Selection *selection);
+ static int _emit_modified(Selection *selection);
/** Schedules an item modification signal to be sent. */
- void _schedule_modified(SPObject *obj, guint flags);
+ void _schedule_modified(SPObject *obj, unsigned int flags);
/** Issues modified selection signal. */
- void _emitModified(guint flags);
+ void _emitModified(unsigned int flags);
/** Issues changed selection signal. */
void _emitChanged(bool persist_selection_context = false);
@@ -374,15 +375,15 @@ private:
LayerModel *_layers;
GC::soft_ptr<SPDesktop> _desktop;
SPObject* _selection_context;
- guint _flags;
- guint _idle;
+ unsigned int _flags;
+ unsigned int _idle;
std::map<SPObject *, sigc::connection> _modified_connections;
std::map<SPObject *, sigc::connection> _release_connections;
sigc::connection _context_release_connection;
sigc::signal<void, Selection *> _changed_signal;
- sigc::signal<void, Selection *, guint> _modified_signal;
+ sigc::signal<void, Selection *, unsigned int> _modified_signal;
};
}
diff --git a/src/seltrans-handles.h b/src/seltrans-handles.h
index 740729a6e..ebd5758c8 100644
--- a/src/seltrans-handles.h
+++ b/src/seltrans-handles.h
@@ -14,11 +14,13 @@
#include <2geom/forward.h>
#include <gdk/gdk.h>
+
#include "enums.h"
-namespace Inkscape
-{
- class SelTrans;
+typedef unsigned int guint32;
+
+namespace Inkscape {
+ class SelTrans;
}
guint32 const DEF_COLOR[] = { 0xff, 0xff6600, 0xff6600, 0xff, 0xff, 0xff };
@@ -34,7 +36,7 @@ enum SPSelTransType {
struct SPSelTransTypeInfo {
guint32 const *color;
- gchar const *tip;
+ char const *tip;
};
// One per handle type in order
extern SPSelTransTypeInfo const handtypes[5];
@@ -45,7 +47,7 @@ struct SPSelTransHandle {
SPSelTransType type;
SPAnchorType anchor;
GdkCursorType cursor;
- guint control;
+ unsigned int control;
gdouble x, y;
};
// These are 4 * each handle type + 1 for center
@@ -64,5 +66,3 @@ extern SPSelTransHandle const hands[17];
End:
*/
// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4 :
-
-
diff --git a/src/seltrans.h b/src/seltrans.h
index 44268ed69..d5db1542d 100644
--- a/src/seltrans.h
+++ b/src/seltrans.h
@@ -15,32 +15,33 @@
* Released under GNU GPL, read the file 'COPYING' for more information
*/
-#include <stddef.h>
-#include <sigc++/sigc++.h>
#include <2geom/point.h>
#include <2geom/affine.h>
#include <2geom/rect.h>
+#include <cstddef>
+#include <sigc++/sigc++.h>
+#include <vector>
+
#include "knot.h"
-#include "selcue.h"
#include "message-context.h"
-#include <vector>
-#include "sp-item.h"
#include "seltrans-handles.h"
+#include "selcue.h"
+#include "sp-item.h"
+
class SPKnot;
class SPDesktop;
struct SPCanvasItem;
struct SPCtrlLine;
struct SPSelTransHandle;
+typedef struct _GSList GSList;
-namespace Inkscape
-{
+namespace Inkscape {
Geom::Scale calcScaleFactors(Geom::Point const &initial_point, Geom::Point const &new_point, Geom::Point const &origin, bool const skew = false);
-namespace XML
-{
- class Node;
+namespace XML {
+ class Node;
}
class SelTrans
@@ -56,26 +57,26 @@ public:
void increaseState();
void resetState();
void setCenter(Geom::Point const &p);
- void grab(Geom::Point const &p, gdouble x, gdouble y, bool show_handles, bool translating);
+ void grab(Geom::Point const &p, double x, double y, bool show_handles, bool translating);
void transform(Geom::Affine const &rel_affine, Geom::Point const &norm);
void ungrab();
void stamp();
- void moveTo(Geom::Point const &xy, guint state);
- void stretch(SPSelTransHandle const &handle, Geom::Point &pt, guint state);
- void scale(Geom::Point &pt, guint state);
- void skew(SPSelTransHandle const &handle, Geom::Point &pt, guint state);
- void rotate(Geom::Point &pt, guint state);
- gboolean request(SPSelTransHandle const &handle, Geom::Point &pt, guint state);
- gboolean scaleRequest(Geom::Point &pt, guint state);
- gboolean stretchRequest(SPSelTransHandle const &handle, Geom::Point &pt, guint state);
- gboolean skewRequest(SPSelTransHandle const &handle, Geom::Point &pt, guint state);
- gboolean rotateRequest(Geom::Point &pt, guint state);
- gboolean centerRequest(Geom::Point &pt, guint state);
-
- gboolean handleRequest(SPKnot *knot, Geom::Point *position, guint state, SPSelTransHandle const &handle);
- void handleGrab(SPKnot *knot, guint state, SPSelTransHandle const &handle);
- void handleClick(SPKnot *knot, guint state, SPSelTransHandle const &handle);
- void handleNewEvent(SPKnot *knot, Geom::Point *position, guint state, SPSelTransHandle const &handle);
+ void moveTo(Geom::Point const &xy, unsigned int state);
+ void stretch(SPSelTransHandle const &handle, Geom::Point &pt, unsigned int state);
+ void scale(Geom::Point &pt, unsigned int state);
+ void skew(SPSelTransHandle const &handle, Geom::Point &pt, unsigned int state);
+ void rotate(Geom::Point &pt, unsigned int state);
+ int request(SPSelTransHandle const &handle, Geom::Point &pt, unsigned int state);
+ int scaleRequest(Geom::Point &pt, unsigned int state);
+ int stretchRequest(SPSelTransHandle const &handle, Geom::Point &pt, unsigned int state);
+ int skewRequest(SPSelTransHandle const &handle, Geom::Point &pt, unsigned int state);
+ int rotateRequest(Geom::Point &pt, unsigned int state);
+ int centerRequest(Geom::Point &pt, unsigned int state);
+
+ int handleRequest(SPKnot *knot, Geom::Point *position, unsigned int state, SPSelTransHandle const &handle);
+ void handleGrab(SPKnot *knot, unsigned int state, SPSelTransHandle const &handle);
+ void handleClick(SPKnot *knot, unsigned int state, SPSelTransHandle const &handle);
+ void handleNewEvent(SPKnot *knot, Geom::Point *position, unsigned int state, SPSelTransHandle const &handle);
enum Show
{
@@ -115,7 +116,7 @@ private:
void _updateHandles();
void _updateVolatileState();
void _selChanged(Inkscape::Selection *selection);
- void _selModified(Inkscape::Selection *selection, guint flags);
+ void _selModified(Inkscape::Selection *selection, unsigned int flags);
void _boundingBoxPrefsChanged(int prefs_bbox);
void _makeHandles();
void _showHandles(SPSelTransType type);
@@ -156,7 +157,7 @@ private:
Geom::OptRect _bbox;
Geom::OptRect _visual_bbox;
Geom::OptRect _geometric_bbox;
- gdouble _strokewidth;
+ double _strokewidth;
Geom::Affine _current_relative_affine;
Geom::Affine _absolute_affine;
@@ -173,8 +174,8 @@ private:
Geom::Point _origin_for_specpoints;
Geom::Point _origin_for_bboxpoints;
- gdouble _handle_x;
- gdouble _handle_y;
+ double _handle_x;
+ double _handle_y;
boost::optional<Geom::Point> _center;
bool _center_is_set; ///< we've already set _center, no need to reread it from items
@@ -184,8 +185,8 @@ private:
SPCanvasItem *_norm;
SPCanvasItem *_grip;
SPCtrlLine *_l[4];
- guint _sel_changed_id;
- guint _sel_modified_id;
+ unsigned int _sel_changed_id;
+ unsigned int _sel_modified_id;
GSList *_stamp_cache;
Geom::Point _origin; ///< position of origin for transforms
diff --git a/src/shape-editor.cpp b/src/shape-editor.cpp
deleted file mode 100644
index bf53e8bc3..000000000
--- a/src/shape-editor.cpp
+++ /dev/null
@@ -1,255 +0,0 @@
-/*
- * Inkscape::ShapeEditor
- *
- * Authors:
- * bulia byak <buliabyak@users.sf.net>
- * Krzysztof Kosiński <tweenk.pl@gmail.com>
- *
- */
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include <string.h>
-#include <glibmm/i18n.h>
-
-#include "sp-object.h"
-#include "sp-item.h"
-#include "sp-lpe-item.h"
-#include "live_effects/lpeobject.h"
-#include "selection.h"
-#include "desktop.h"
-#include "document.h"
-#include "desktop-handles.h"
-#include "knotholder.h"
-#include "live_effects/parameter/point.h"
-#include "xml/node-event-vector.h"
-#include "preferences.h"
-#include "object-edit.h"
-#include "style.h"
-#include "display/curve.h"
-#include <2geom/pathvector.h>
-
-#include "shape-editor.h"
-
-using Inkscape::createKnotHolder;
-
-bool ShapeEditor::_blockSetItem = false;
-
-ShapeEditor::ShapeEditor(SPDesktop *dt) {
- this->desktop = dt;
- this->knotholder = NULL;
- this->knotholder_listener_attached_for = NULL;
-}
-
-ShapeEditor::~ShapeEditor() {
- unset_item(SH_KNOTHOLDER);
-}
-
-void ShapeEditor::unset_item(SubType type, bool keep_knotholder) {
- switch (type) {
- case SH_NODEPATH:
- // defunct
- break;
- case SH_KNOTHOLDER:
- if (this->knotholder) {
- Inkscape::XML::Node *old_repr = this->knotholder->repr;
- if (old_repr && old_repr == knotholder_listener_attached_for) {
- sp_repr_remove_listener_by_data(old_repr, this);
- Inkscape::GC::release(old_repr);
- knotholder_listener_attached_for = NULL;
- }
-
- if (!keep_knotholder) {
- delete this->knotholder;
- this->knotholder = NULL;
- }
- }
- break;
- }
-}
-
-bool ShapeEditor::has_nodepath () {
- return false;
-}
-
-bool ShapeEditor::has_knotholder () {
- return (this->knotholder != NULL);
-}
-
-void ShapeEditor::update_knotholder () {
- if (this->knotholder)
- this->knotholder->update_knots();
-}
-
-bool ShapeEditor::has_local_change (SubType type) {
- switch (type) {
- case SH_NODEPATH:
- // defunct
- return false;
- case SH_KNOTHOLDER:
- return (this->knotholder && this->knotholder->local_change != 0);
- default:
- g_assert_not_reached();
- }
-}
-
-void ShapeEditor::decrement_local_change (SubType type) {
- switch (type) {
- case SH_NODEPATH:
- // defunct
- break;
- case SH_KNOTHOLDER:
- if (this->knotholder) {
- this->knotholder->local_change = FALSE;
- }
- break;
- default:
- g_assert_not_reached();
- }
-}
-
-const SPItem *ShapeEditor::get_item (SubType type) {
- const SPItem *item = NULL;
- switch (type) {
- case SH_NODEPATH:
- // defunct
- break;
- case SH_KNOTHOLDER:
- if (this->has_knotholder()) {
- item = this->knotholder->getItem();
- }
- break;
- }
- return item;
-}
-
-GList *ShapeEditor::save_nodepath_selection () {
- // defunct stub
- return NULL;
-}
-
-void ShapeEditor::restore_nodepath_selection (GList */*saved*/) {
- // defunct stub
-}
-
-void ShapeEditor::shapeeditor_event_attr_changed(gchar const *name)
-{
- gboolean changed_kh = FALSE;
-
- if (has_knotholder())
- {
- changed_kh = !has_local_change(SH_KNOTHOLDER);
- decrement_local_change(SH_KNOTHOLDER);
- if (changed_kh) {
- // this can happen if an LPEItem's knotholder handle was dragged, in which case we want
- // to keep the knotholder; in all other cases (e.g., if the LPE itself changes) we delete it
- reset_item(SH_KNOTHOLDER, !strcmp(name, "d"));
- }
- }
-}
-
-
-static void shapeeditor_event_attr_changed(Inkscape::XML::Node */*repr*/, gchar const *name,
- gchar const */*old_value*/, gchar const */*new_value*/,
- bool /*is_interactive*/, gpointer data)
-{
- g_assert(data);
- ShapeEditor *sh = static_cast<ShapeEditor *>(data);
-
- sh->shapeeditor_event_attr_changed(name);
-}
-
-static Inkscape::XML::NodeEventVector shapeeditor_repr_events = {
- NULL, /* child_added */
- NULL, /* child_removed */
- shapeeditor_event_attr_changed,
- NULL, /* content_changed */
- NULL /* order_changed */
-};
-
-
-void ShapeEditor::set_item(SPItem *item, SubType type, bool keep_knotholder) {
- if (_blockSetItem) {
- return;
- }
-
- // this happens (and should only happen) when for an LPEItem having both knotholder and
- // nodepath the knotholder is adapted; in this case we don't want to delete the knotholder
- // since this freezes the handles
- unset_item(type, keep_knotholder);
-
- if (item) {
- Inkscape::XML::Node *repr;
- switch(type) {
- case SH_NODEPATH:
- // defunct
- break;
-
- case SH_KNOTHOLDER:
- if (!this->knotholder) {
- // only recreate knotholder if none is present
- this->knotholder = createKnotHolder(item, desktop);
- }
- if (this->knotholder) {
- this->knotholder->update_knots();
- // setting new listener
- repr = this->knotholder->repr;
- if (repr != knotholder_listener_attached_for) {
- Inkscape::GC::anchor(repr);
- sp_repr_add_listener(repr, &shapeeditor_repr_events, this);
- knotholder_listener_attached_for = repr;
- }
- }
- break;
- }
- }
-}
-
-
-/** FIXME: This thing is only called when the item needs to be updated in response to repr change.
- Why not make a reload function in NodePath and in KnotHolder? */
-void ShapeEditor::reset_item (SubType type, bool keep_knotholder)
-{
- switch (type) {
- case SH_NODEPATH:
- // defunct
- break;
- case SH_KNOTHOLDER:
- if ( knotholder ) {
- SPObject *obj = sp_desktop_document(desktop)->getObjectByRepr(knotholder_listener_attached_for); /// note that it is not certain that this is an SPItem; it could be a LivePathEffectObject.
- set_item(SP_ITEM(obj), SH_KNOTHOLDER, keep_knotholder);
- }
- break;
- }
-}
-
-void ShapeEditor::nodepath_destroyed () {
-}
-
-bool ShapeEditor::has_selection() {
- return false; // so far, knotholder cannot have selection
-}
-
-/**
- * Returns true if this ShapeEditor has a knot above which the mouse currently hovers.
- */
-bool ShapeEditor::knot_mouseover() const {
- if (this->knotholder) {
- return knotholder->knot_mouseover();
- }
-
- return false;
-}
-
-/*
- Local Variables:
- mode:c++
- c-file-style:"stroustrup"
- c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
- indent-tabs-mode:nil
- fill-column:99
- End:
-*/
-// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4 :
diff --git a/src/shape-editor.h b/src/shape-editor.h
deleted file mode 100644
index ec4b50fa3..000000000
--- a/src/shape-editor.h
+++ /dev/null
@@ -1,95 +0,0 @@
-#ifndef SEEN_SHAPE_EDITOR_H
-#define SEEN_SHAPE_EDITOR_H
-
-/*
- * Inkscape::ShapeEditor
- *
- * This is a container class which contains either knotholder (for shapes) or nodepath (for
- * paths). It is attached to a single item so only one of these is active at a time.
- *
- * Authors:
- * bulia byak <buliabyak@users.sf.net>
- *
- */
-
-#include <glib.h>
-
-#include <2geom/forward.h>
-
-
-namespace Inkscape { namespace NodePath { class Path; } }
-namespace Inkscape { namespace XML { class Node; } }
-
-class KnotHolder;
-class LivePathEffectObject;
-class SPDesktop;
-class SPItem;
-class SPNodeContext;
-class ShapeEditorsCollective;
-
-#include <2geom/point.h>
-#include <boost/optional.hpp>
-#include <vector>
-
-enum SubType{
- SH_NODEPATH,
- SH_KNOTHOLDER
-};
-
-class ShapeEditor {
-public:
-
- ShapeEditor(SPDesktop *desktop);
- ~ShapeEditor();
-
- void set_item (SPItem *item, SubType type, bool keep_knotholder = false);
- void unset_item (SubType type, bool keep_knotholder = false);
-
- bool has_nodepath (); //((deprecated))
- void update_knotholder (); //((deprecated))
-
- bool has_local_change (SubType type);
- void decrement_local_change (SubType type);
-
- GList *save_nodepath_selection ();
- void restore_nodepath_selection (GList *saved);
-
- void nodepath_destroyed ();
-
- bool has_selection ();
-
- Inkscape::NodePath::Path *get_nodepath() {return NULL;} //((deprecated))
- ShapeEditorsCollective *get_container() {return NULL;}
-
- // this one is only public because it's called from non-C++ repr changed callback
- void shapeeditor_event_attr_changed(gchar const *name);
-
- bool knot_mouseover() const;
-
- static void blockSetItem(bool b) {_blockSetItem = b;}
-
-private:
- bool has_knotholder ();
- void reset_item (SubType type, bool keep_knotholder = true);
- const SPItem *get_item (SubType type);
- static bool _blockSetItem;
-
- SPDesktop *desktop;
- KnotHolder *knotholder;
- Inkscape::XML::Node *knotholder_listener_attached_for;
-};
-
-#endif // SEEN_SHAPE_EDITOR_H
-
-
-/*
- Local Variables:
- mode:c++
- c-file-style:"stroustrup"
- c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
- indent-tabs-mode:nil
- fill-column:99
- End:
-*/
-// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4 :
-
diff --git a/src/shortcuts.h b/src/shortcuts.h
index 406768f97..f24a82603 100644
--- a/src/shortcuts.h
+++ b/src/shortcuts.h
@@ -1,5 +1,5 @@
-#ifndef __SP_SHORTCUTS_H__
-#define __SP_SHORTCUTS_H__
+#ifndef SEEN_SP_SHORTCUTS_H
+#define SEEN_SP_SHORTCUTS_H
/*
* Keyboard shortcut processing
@@ -16,9 +16,6 @@
typedef struct _GtkAccelGroup GtkAccelGroup;
typedef struct _GtkWidget GtkWidget;
-struct _GtkAccelGroup;
-struct _GtkWidget;
-
namespace Inkscape {
class Verb;
namespace UI {
@@ -42,14 +39,14 @@ bool sp_shortcut_invoke (unsigned int shortcut, Inkscape::UI::View::View *view);
void sp_shortcut_init();
Inkscape::Verb * sp_shortcut_get_verb (unsigned int shortcut);
unsigned int sp_shortcut_get_primary (Inkscape::Verb * verb); // Returns GDK_VoidSymbol if no shortcut is found.
-gchar* sp_shortcut_get_label (unsigned int shortcut); // Returns the human readable form of the shortcut (or NULL), for example Shift+Ctrl+F. Free the returned string with g_free.
+char* sp_shortcut_get_label (unsigned int shortcut); // Returns the human readable form of the shortcut (or NULL), for example Shift+Ctrl+F. Free the returned string with g_free.
void sp_shortcut_set(unsigned int const shortcut, Inkscape::Verb *const verb, bool const is_primary, bool const is_user_set=false);
void sp_shortcut_unset(unsigned int const shortcut);
void sp_shortcut_add_to_file(char const *action, unsigned int const shortcut);
void sp_shortcut_delete_from_file(char const *action, unsigned int const shortcut);
void sp_shortcuts_delete_all_from_file();
Glib::ustring sp_shortcut_to_label(unsigned int const shortcut);
-unsigned int sp_gdkmodifier_to_shortcut(guint accel_key, Gdk::ModifierType gdkmodifier, guint hardware_keycode);
+unsigned int sp_gdkmodifier_to_shortcut(unsigned int accel_key, Gdk::ModifierType gdkmodifier, unsigned int hardware_keycode);
void sp_shortcut_get_file_names(std::vector<Glib::ustring> *names, std::vector<Glib::ustring> *paths);
bool sp_shortcut_is_user_set(Inkscape::Verb *verb);
void sp_shortcut_file_export();
diff --git a/src/snap-candidate.h b/src/snap-candidate.h
index 8bb7cb52f..54e33e1a8 100644
--- a/src/snap-candidate.h
+++ b/src/snap-candidate.h
@@ -14,7 +14,10 @@
* Released under GNU GPL, read the file 'COPYING' for more information
*/
-//#include "snapped-point.h"
+#include <2geom/point.h>
+#include <2geom/rect.h>
+#include <cstdio>
+
#include "snap-enums.h"
class SPItem; // forward declaration
diff --git a/src/snap-preferences.h b/src/snap-preferences.h
index a7a2e2926..7bdeea52e 100644
--- a/src/snap-preferences.h
+++ b/src/snap-preferences.h
@@ -49,13 +49,13 @@ public:
void setSnapPerp(bool enabled) {_snap_perp = enabled;}
void setSnapTang(bool enabled) {_snap_tang = enabled;}
- gdouble getGridTolerance() const {return _grid_tolerance;}
- gdouble getGuideTolerance() const {return _guide_tolerance;}
- gdouble getObjectTolerance() const {return _object_tolerance;}
+ double getGridTolerance() const {return _grid_tolerance;}
+ double getGuideTolerance() const {return _guide_tolerance;}
+ double getObjectTolerance() const {return _object_tolerance;}
- void setGridTolerance(gdouble val) {_grid_tolerance = val;}
- void setGuideTolerance(gdouble val) {_guide_tolerance = val;}
- void setObjectTolerance(gdouble val) {_object_tolerance = val;}
+ void setGridTolerance(double val) {_grid_tolerance = val;}
+ void setGuideTolerance(double val) {_guide_tolerance = val;}
+ void setObjectTolerance(double val) {_object_tolerance = val;}
private:
@@ -91,9 +91,9 @@ private:
bool _snap_perp;
bool _snap_tang;
- gdouble _grid_tolerance;
- gdouble _guide_tolerance;
- gdouble _object_tolerance;
+ double _grid_tolerance;
+ double _guide_tolerance;
+ double _object_tolerance;
};
}
diff --git a/src/snap.cpp b/src/snap.cpp
index 5b795b22f..8138e4546 100644
--- a/src/snap.cpp
+++ b/src/snap.cpp
@@ -116,7 +116,7 @@ void SnapManager::freeSnapReturnByRef(Geom::Point &p,
Inkscape::SnapSourceType const source_type,
Geom::OptRect const &bbox_to_snap) const
{
- Inkscape::SnappedPoint const s = freeSnap(Inkscape::SnapCandidatePoint(p, source_type), bbox_to_snap);
+ Inkscape::SnappedPoint const s = freeSnap(Inkscape::SnapCandidatePoint(p, source_type, Inkscape::SNAPTARGET_PATH), bbox_to_snap);
s.getPointIfSnapped(p);
}
@@ -430,7 +430,7 @@ void SnapManager::guideConstrainedSnap(Geom::Point &p, SPGuide const &guideline)
Inkscape::SnapCandidatePoint candidate(p, Inkscape::SNAPSOURCE_GUIDE_ORIGIN, Inkscape::SNAPTARGET_UNDEFINED);
IntermSnapResults isr;
- Inkscape::Snapper::SnapConstraint cl(guideline.point_on_line, Geom::rot90(guideline.normal_to_line));
+ Inkscape::Snapper::SnapConstraint cl(guideline.getPoint(), Geom::rot90(guideline.getNormal()));
SnapperList snappers = getSnappers();
for (SnapperList::const_iterator i = snappers.begin(); i != snappers.end(); ++i) {
diff --git a/src/snap.h b/src/snap.h
index 67af20063..20b2b246f 100644
--- a/src/snap.h
+++ b/src/snap.h
@@ -32,6 +32,7 @@ enum SPGuideDragType { // used both here and in desktop-events.cpp
class SPGuide;
class SPNamedView;
+typedef struct _GSList GSList;
/**
* Class to coordinate snapping operations.
diff --git a/src/snapped-curve.h b/src/snapped-curve.h
index 6bb8bfeca..0e3a1c747 100644
--- a/src/snapped-curve.h
+++ b/src/snapped-curve.h
@@ -11,14 +11,14 @@
* Released under GNU GPL, read the file 'COPYING' for more information.
*/
+#include <2geom/forward.h>
#include <vector>
#include <list>
+
#include "snapped-point.h"
#include "snapped-line.h"
-#include <2geom/forward.h>
-namespace Inkscape
-{
+namespace Inkscape {
/// Class describing the result of an attempt to snap to a curve.
class SnappedCurve : public SnappedPoint
diff --git a/src/snapped-point.h b/src/snapped-point.h
index bf440c450..9d77ab162 100644
--- a/src/snapped-point.h
+++ b/src/snapped-point.h
@@ -12,10 +12,11 @@
* Released under GNU GPL, read the file 'COPYING' for more information.
*/
-#include <vector>
-#include <list>
#include <2geom/geom.h>
-#include <snap-candidate.h>
+#include <list>
+#include <vector>
+
+#include "snap-candidate.h"
namespace Inkscape
{
diff --git a/src/snapper.h b/src/snapper.h
index c609239cf..9616d0954 100644
--- a/src/snapper.h
+++ b/src/snapper.h
@@ -12,15 +12,14 @@
* Released under GNU GPL, read the file 'COPYING' for more information.
*/
-#include <map>
-#include <list>
#include <boost/optional.hpp>
-#include <glib.h> // for g_assert
+#include <cstdio>
+#include <list>
+#include "snap-candidate.h"
#include "snapped-point.h"
#include "snapped-line.h"
#include "snapped-curve.h"
-#include "snap-candidate.h"
struct IntermSnapResults {
std::list<Inkscape::SnappedPoint> points;
@@ -86,7 +85,7 @@ public:
bool hasPoint() const {return _type != DIRECTION && _type != UNDEFINED;}
Geom::Point getPoint() const {
- g_assert(_type != DIRECTION && _type != UNDEFINED);
+ assert(_type != DIRECTION && _type != UNDEFINED);
return _point;
}
@@ -95,7 +94,7 @@ public:
}
Geom::Coord getRadius() const {
- g_assert(_type == CIRCLE);
+ assert(_type == CIRCLE);
return _radius;
}
@@ -121,7 +120,7 @@ public:
Geom::Point const p2_on_cl = p1_on_cl + _direction;
return Geom::projection(p, Geom::Line(p1_on_cl, p2_on_cl));
} else {
- g_warning("Bug: trying to find the projection onto an undefined constraint");
+ printf("WARNING: Bug: trying to find the projection onto an undefined constraint");
return Geom::Point();
}
}
diff --git a/src/sp-anchor.h b/src/sp-anchor.h
index 778640032..d17718344 100644
--- a/src/sp-anchor.h
+++ b/src/sp-anchor.h
@@ -1,5 +1,5 @@
-#ifndef __SP_ANCHOR_H__
-#define __SP_ANCHOR_H__
+#ifndef SEEN_SP_ANCHOR_H
+#define SEEN_SP_ANCHOR_H
/*
* SVG <a> element implementation
@@ -23,16 +23,16 @@ public:
SPAnchor();
virtual ~SPAnchor();
- gchar *href;
+ char *href;
virtual void build(SPDocument *document, Inkscape::XML::Node *repr);
virtual void release();
- virtual void set(unsigned int key, gchar const* value);
- virtual Inkscape::XML::Node* write(Inkscape::XML::Document *xml_doc, Inkscape::XML::Node *repr, guint flags);
+ virtual void set(unsigned int key, char const* value);
+ virtual Inkscape::XML::Node* write(Inkscape::XML::Document *xml_doc, Inkscape::XML::Node *repr, unsigned int flags);
virtual const char* displayName() const;
- virtual gchar* description() const;
- virtual gint event(SPEvent *event);
+ virtual char* description() const;
+ virtual int event(SPEvent *event);
};
#endif
diff --git a/src/sp-clippath.h b/src/sp-clippath.h
index ba7a90a57..eb8b14174 100644
--- a/src/sp-clippath.h
+++ b/src/sp-clippath.h
@@ -19,6 +19,9 @@
#define SP_IS_CLIPPATH(obj) (dynamic_cast<const SPClipPath*>((SPObject*)obj) != NULL)
struct SPClipPathView;
+typedef struct _GSList GSList;
+
+#include <cstdio>
#include "sp-object-group.h"
#include "uri-references.h"
@@ -42,8 +45,8 @@ public:
unsigned int clipPathUnits : 1;
SPClipPathView *display;
- static const gchar *create(GSList *reprs, SPDocument *document, Geom::Affine const* applyTransform);
- static GType sp_clippath_get_type(void);
+ static char const *create(GSList *reprs, SPDocument *document, Geom::Affine const* applyTransform);
+ //static GType sp_clippath_get_type(void);
Inkscape::DrawingItem *show(Inkscape::Drawing &drawing, unsigned int key);
void hide(unsigned int key);
@@ -57,12 +60,12 @@ protected:
virtual void child_added(Inkscape::XML::Node* child, Inkscape::XML::Node* ref);
- virtual void set(unsigned int key, const gchar* value);
+ virtual void set(unsigned int key, char const* value);
virtual void update(SPCtx* ctx, unsigned int flags);
virtual void modified(unsigned int flags);
- virtual Inkscape::XML::Node* write(Inkscape::XML::Document* doc, Inkscape::XML::Node* repr, guint flags);
+ virtual Inkscape::XML::Node* write(Inkscape::XML::Document* doc, Inkscape::XML::Node* repr, unsigned int flags);
};
@@ -90,10 +93,10 @@ protected:
Inkscape::XML::Node * const owner_repr = owner->getRepr();
//XML Tree being used directly here while it shouldn't be...
Inkscape::XML::Node * const obj_repr = obj->getRepr();
- gchar const * owner_name = NULL;
- gchar const * owner_clippath = NULL;
- gchar const * obj_name = NULL;
- gchar const * obj_id = NULL;
+ char const * owner_name = NULL;
+ char const * owner_clippath = NULL;
+ char const * obj_name = NULL;
+ char const * obj_id = NULL;
if (owner_repr != NULL) {
owner_name = owner_repr->name();
owner_clippath = owner_repr->attribute("clippath");
@@ -102,7 +105,7 @@ protected:
obj_name = obj_repr->name();
obj_id = obj_repr->attribute("id");
}
- g_warning("Ignoring recursive clippath reference "
+ printf("WARNING: Ignoring recursive clippath reference "
"<%s clippath=\"%s\"> in <%s id=\"%s\">",
owner_name, owner_clippath,
obj_name, obj_id);
diff --git a/src/sp-conn-end-pair.h b/src/sp-conn-end-pair.h
index 9f7f5a5d2..93f54378c 100644
--- a/src/sp-conn-end-pair.h
+++ b/src/sp-conn-end-pair.h
@@ -11,12 +11,10 @@
*
* Released under GNU GPL, read the file 'COPYING' for more information
*/
-#include <glib.h>
-#include <stddef.h>
-#include <sigc++/connection.h>
-#include <sigc++/functors/slot.h>
-#include <sigc++/signal.h>
+#include <cstddef>
+#include <sigc++/sigc++.h>
+
#include "libavoid/connector.h"
@@ -33,21 +31,21 @@ class Node;
}
}
-extern void recreateCurve(SPCurve *curve, Avoid::ConnRef *connRef, gdouble curvature);
+extern void recreateCurve(SPCurve *curve, Avoid::ConnRef *connRef, double curvature);
class SPConnEndPair {
public:
SPConnEndPair(SPPath *);
~SPConnEndPair();
void release();
- void setAttr(unsigned const key, gchar const *const value);
+ void setAttr(unsigned const key, char const *const value);
void writeRepr(Inkscape::XML::Node *const repr) const;
void getAttachedItems(SPItem *[2]) const;
void getEndpoints(Geom::Point endPts[]) const;
- gdouble getCurvature(void) const;
+ double getCurvature(void) const;
SPConnEnd** getConnEnds(void);
bool isOrthogonal(void) const;
- friend void recreateCurve(SPCurve *curve, Avoid::ConnRef *connRef, gdouble curvature);
+ friend void recreateCurve(SPCurve *curve, Avoid::ConnRef *connRef, double curvature);
void tellLibavoidNewEndpoints(const bool processTransaction = false);
bool reroutePathFromLibavoid(void);
void makePathInvalid(void);
@@ -64,7 +62,7 @@ private:
Avoid::ConnRef *_connRef;
int _connType;
- gdouble _connCurvature;
+ double _connCurvature;
// A sigc connection for transformed signal.
sigc::connection _transformed_connection;
diff --git a/src/sp-conn-end.h b/src/sp-conn-end.h
index a0b1ba5df..2b89a159d 100644
--- a/src/sp-conn-end.h
+++ b/src/sp-conn-end.h
@@ -1,8 +1,7 @@
#ifndef SEEN_SP_CONN_END
#define SEEN_SP_CONN_END
-#include <glib.h>
-#include <stddef.h>
+#include <cstddef>
#include <sigc++/connection.h>
#include "sp-use-reference.h"
@@ -15,7 +14,7 @@ public:
SPConnEnd(SPObject *owner);
SPUseReference ref;
- gchar *href;
+ char *href;
/** Change of href string (not a modification of the attributes of the referrent). */
sigc::connection _changed_connection;
@@ -29,13 +28,13 @@ public:
/** A sigc connection for owning group transformed, used to do move compensation. */
sigc::connection _group_connection;
- void setAttacherHref(gchar const *, SPPath *);
- void setAttacherEndpoint(gchar const *, SPPath *);
+ void setAttacherHref(char const * value, SPPath * unused);
+ //void setAttacherEndpoint(char const *, SPPath *); // not defined
private:
- SPConnEnd(SPConnEnd const &);
- SPConnEnd &operator=(SPConnEnd const &);
+ SPConnEnd(SPConnEnd const &); // no copy
+ SPConnEnd &operator=(SPConnEnd const &); // no assign
};
void sp_conn_end_href_changed(SPObject *old_ref, SPObject *ref,
diff --git a/src/sp-cursor.cpp b/src/sp-cursor.cpp
index ea73da00c..16659d1cf 100644
--- a/src/sp-cursor.cpp
+++ b/src/sp-cursor.cpp
@@ -17,13 +17,14 @@
*/
#include <cstring>
+#include <gdk/gdk.h>
#include <map>
#include <sstream>
#include "color.h"
#include "sp-cursor.h"
-static void free_cursor_data(guchar *pixels, gpointer /*data*/) {
+static void free_cursor_data(unsigned char *pixels, void* /*data*/) {
delete [] reinterpret_cast<guint32*>(pixels);
}
@@ -53,7 +54,7 @@ struct RGBA {
}
};
-GdkPixbuf *sp_cursor_pixbuf_from_xpm(gchar const *const *xpm, GdkColor const& black, GdkColor const& white, guint32 fill, guint32 stroke)
+GdkPixbuf *sp_cursor_pixbuf_from_xpm(char const *const *xpm, GdkColor const& black, GdkColor const& white, guint32 fill, guint32 stroke)
{
int height = 0;
int width = 0;
@@ -72,7 +73,7 @@ GdkPixbuf *sp_cursor_pixbuf_from_xpm(gchar const *const *xpm, GdkColor const& bl
char const *p = xpm[1 + i];
g_assert(*p >=0);
- guchar const ccode = (guchar) *p;
+ unsigned char const ccode = (guchar) *p;
p++;
while (isspace(*p)) {
@@ -110,7 +111,7 @@ GdkPixbuf *sp_cursor_pixbuf_from_xpm(gchar const *const *xpm, GdkColor const& bl
return gdk_pixbuf_new_from_data(reinterpret_cast<guchar*>(pixmap_buffer), GDK_COLORSPACE_RGB, TRUE, 8, width, height, width * sizeof(guint32), free_cursor_data, NULL);
}
-GdkCursor *sp_cursor_new_from_xpm(gchar const *const *xpm, gint hot_x, gint hot_y)
+GdkCursor *sp_cursor_new_from_xpm(char const *const *xpm, int hot_x, int hot_y)
{
GdkCursor *cursor = 0;
GdkPixbuf *pixbuf = gdk_pixbuf_new_from_xpm_data((const gchar **)xpm);
diff --git a/src/sp-cursor.h b/src/sp-cursor.h
index f445127ad..c0b8b46a3 100644
--- a/src/sp-cursor.h
+++ b/src/sp-cursor.h
@@ -1,10 +1,13 @@
#ifndef SP_CURSOR_H
#define SP_CURSOR_H
-#include <gdk/gdk.h>
+typedef unsigned int guint32;
+typedef struct _GdkPixbuf GdkPixbuf;
+typedef struct _GdkCursor GdkCursor;
+typedef struct _GdkColor GdkColor;
-GdkPixbuf* sp_cursor_pixbuf_from_xpm(gchar const *const *xpm, GdkColor const& black, GdkColor const& white, guint32 fill, guint32 stroke);
-GdkCursor *sp_cursor_new_from_xpm(gchar const *const *xpm, gint hot_x, gint hot_y);
+GdkPixbuf* sp_cursor_pixbuf_from_xpm(char const *const *xpm, GdkColor const& black, GdkColor const& white, guint32 fill, guint32 stroke);
+GdkCursor *sp_cursor_new_from_xpm(char const *const *xpm, int hot_x, int hot_y);
#endif
diff --git a/src/sp-defs.h b/src/sp-defs.h
index 6efdea1f3..c122cb2a9 100644
--- a/src/sp-defs.h
+++ b/src/sp-defs.h
@@ -27,7 +27,7 @@ protected:
virtual void release();
virtual void update(SPCtx* ctx, unsigned int flags);
virtual void modified(unsigned int flags);
- virtual Inkscape::XML::Node* write(Inkscape::XML::Document *xml_doc, Inkscape::XML::Node *repr, guint flags);
+ virtual Inkscape::XML::Node* write(Inkscape::XML::Document *xml_doc, Inkscape::XML::Node *repr, unsigned int flags);
};
#endif // !SEEN_SP_DEFS_H
diff --git a/src/sp-desc.h b/src/sp-desc.h
index 2bb42b333..40888bee4 100644
--- a/src/sp-desc.h
+++ b/src/sp-desc.h
@@ -1,5 +1,5 @@
-#ifndef __SP_DESC_H__
-#define __SP_DESC_H__
+#ifndef SEEN_SP_DESC_H
+#define SEEN_SP_DESC_H
/*
* SVG <desc> implementation
@@ -23,7 +23,7 @@ public:
virtual ~SPDesc();
protected:
- virtual Inkscape::XML::Node* write(Inkscape::XML::Document* doc, Inkscape::XML::Node* repr, guint flags);
+ virtual Inkscape::XML::Node* write(Inkscape::XML::Document* doc, Inkscape::XML::Node* repr, unsigned int flags);
};
#endif
diff --git a/src/sp-ellipse.cpp b/src/sp-ellipse.cpp
index cda59e057..b5c6e4af8 100644
--- a/src/sp-ellipse.cpp
+++ b/src/sp-ellipse.cpp
@@ -14,26 +14,25 @@
* Released under GNU GPL, read the file 'COPYING' for more information
*/
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif
-
-#include "svg/svg.h"
-#include "svg/path-string.h"
-#include "xml/repr.h"
-#include "attributes.h"
-#include "style.h"
-#include "display/curve.h"
+#include <glibmm.h>
#include <glibmm/i18n.h>
+
#include <2geom/angle.h>
#include <2geom/ellipse.h>
-#include <2geom/transforms.h>
-#include <2geom/pathvector.h>
#include <2geom/path-sink.h>
+#include <2geom/pathvector.h>
+#include <2geom/transforms.h>
+
+#include "attributes.h"
+#include "display/curve.h"
#include "document.h"
-#include "sp-ellipse.h"
#include "preferences.h"
#include "snap-candidate.h"
+#include "sp-ellipse.h"
+#include "style.h"
+#include "svg/svg.h"
+#include "svg/path-string.h"
+#include "xml/repr.h"
#include "sp-factory.h"
@@ -42,21 +41,21 @@ SPObject *create_ellipse()
{
SPGenericEllipse *ellipse = new SPGenericEllipse();
ellipse->type = SP_GENERIC_ELLIPSE_ELLIPSE;
- return (SPObject*)ellipse;
+ return ellipse;
}
SPObject *create_circle()
{
SPGenericEllipse *circle = new SPGenericEllipse();
circle->type = SP_GENERIC_ELLIPSE_CIRCLE;
- return (SPObject*)circle;
+ return circle;
}
SPObject *create_arc()
{
SPGenericEllipse *arc = new SPGenericEllipse();
arc->type = SP_GENERIC_ELLIPSE_ARC;
- return (SPObject*)arc;
+ return arc;
}
bool ellipse_registered = SPFactory::instance().registerObject("svg:ellipse", create_ellipse);
@@ -695,4 +694,4 @@ bool SPGenericEllipse::_isSlice() const
fill-column:99
End:
*/
-// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8 :
diff --git a/src/sp-ellipse.h b/src/sp-ellipse.h
index cb988b8bb..09768fd6d 100644
--- a/src/sp-ellipse.h
+++ b/src/sp-ellipse.h
@@ -1,7 +1,4 @@
-#ifndef __SP_ELLIPSE_H__
-#define __SP_ELLIPSE_H__
-
-/*
+/**
* SVG <ellipse> and related implementations
*
* Authors:
@@ -16,15 +13,18 @@
* Released under GNU GPL, read the file 'COPYING' for more information
*/
+#ifndef SEEN_SP_ELLIPSE_H
+#define SEEN_SP_ELLIPSE_H
+
#include "svg/svg-length.h"
#include "sp-shape.h"
/* Common parent class */
-#define SP_GENERICELLIPSE(obj) (dynamic_cast<SPGenericEllipse*>((SPObject*)obj))
-#define SP_IS_GENERICELLIPSE(obj) (dynamic_cast<const SPGenericEllipse*>((SPObject*)obj) != NULL)
+#define SP_GENERICELLIPSE(obj) (dynamic_cast<SPGenericEllipse*>(obj))
+#define SP_IS_GENERICELLIPSE(obj) (dynamic_cast<const SPGenericEllipse*>((obj)) != NULL)
enum GenericEllipseType {
- SP_GENERIC_ELLIPSE_UNDEFINED,
+ SP_GENERIC_ELLIPSE_UNDEFINED, // FIXME shouldn't exist
SP_GENERIC_ELLIPSE_ARC,
SP_GENERIC_ELLIPSE_CIRCLE,
SP_GENERIC_ELLIPSE_ELLIPSE
@@ -53,10 +53,10 @@ public:
virtual void build(SPDocument *document, Inkscape::XML::Node *repr);
- virtual void set(unsigned int key, gchar const *value);
+ virtual void set(unsigned int key, char const *value);
virtual void update(SPCtx *ctx, unsigned int flags);
- virtual Inkscape::XML::Node *write(Inkscape::XML::Document *xml_doc, Inkscape::XML::Node *repr, guint flags);
+ virtual Inkscape::XML::Node *write(Inkscape::XML::Document *xml_doc, Inkscape::XML::Node *repr, unsigned int flags);
virtual const char *displayName() const;
virtual void set_shape();
@@ -76,7 +76,7 @@ public:
Geom::Point getPointAtAngle(double arg) const;
bool set_elliptical_path_attribute(Inkscape::XML::Node *repr);
- void position_set(gdouble x, gdouble y, gdouble rx, gdouble ry);
+ void position_set(double x, double y, double rx, double ry);
protected:
/**
@@ -98,4 +98,4 @@ protected:
fill-column:99
End:
*/
-// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8 :
diff --git a/src/sp-filter-primitive.cpp b/src/sp-filter-primitive.cpp
index ceb91c984..1f85c8193 100644
--- a/src/sp-filter-primitive.cpp
+++ b/src/sp-filter-primitive.cpp
@@ -19,14 +19,15 @@
#include <string.h>
+#include "display/nr-filter-primitive.h"
+#include "display/nr-filter-types.h"
+
#include "attributes.h"
#include "style.h"
#include "sp-filter-primitive.h"
#include "xml/repr.h"
#include "sp-filter.h"
#include "sp-item.h"
-#include "display/nr-filter-primitive.h"
-#include "display/nr-filter-types.h"
// CPPIFY: Make pure virtual.
diff --git a/src/sp-filter-primitive.h b/src/sp-filter-primitive.h
index 040e2f31f..d81adbd10 100644
--- a/src/sp-filter-primitive.h
+++ b/src/sp-filter-primitive.h
@@ -1,5 +1,5 @@
-#ifndef __SP_FILTER_PRIMITIVE_H__
-#define __SP_FILTER_PRIMITIVE_H__
+#ifndef SEEN_SP_FILTER_PRIMITIVE_H
+#define SEEN_SP_FILTER_PRIMITIVE_H
/** \file
* Document level base class for all SVG filter primitives.
@@ -40,11 +40,11 @@ protected:
virtual void build(SPDocument* doc, Inkscape::XML::Node* repr);
virtual void release();
- virtual void set(unsigned int key, const gchar* value);
+ virtual void set(unsigned int key, char const* value);
virtual void update(SPCtx* ctx, unsigned int flags);
- virtual Inkscape::XML::Node* write(Inkscape::XML::Document* doc, Inkscape::XML::Node* repr, guint flags);
+ virtual Inkscape::XML::Node* write(Inkscape::XML::Document* doc, Inkscape::XML::Node* repr, unsigned int flags);
public:
virtual void build_renderer(Inkscape::Filters::Filter* filter) = 0;
@@ -54,8 +54,8 @@ public:
void sp_filter_primitive_renderer_common(SPFilterPrimitive *sp_prim, Inkscape::Filters::FilterPrimitive *nr_prim);
int sp_filter_primitive_name_previous_out(SPFilterPrimitive *prim);
-int sp_filter_primitive_read_in(SPFilterPrimitive *prim, gchar const *name);
-int sp_filter_primitive_read_result(SPFilterPrimitive *prim, gchar const *name);
+int sp_filter_primitive_read_in(SPFilterPrimitive *prim, char const *name);
+int sp_filter_primitive_read_result(SPFilterPrimitive *prim, char const *name);
#endif
/*
diff --git a/src/sp-filter.cpp b/src/sp-filter.cpp
index e8319baca..9a184952c 100644
--- a/src/sp-filter.cpp
+++ b/src/sp-filter.cpp
@@ -22,8 +22,9 @@
using std::map;
using std::pair;
-#include <glibmm/stringutils.h>
+#include <glibmm.h>
#include "attributes.h"
+#include "display/nr-filter.h"
#include "document.h"
#include "sp-filter.h"
#include "sp-filter-reference.h"
@@ -37,8 +38,6 @@ using std::pair;
#define SP_MACROS_SILENT
#include "macros.h"
-#include "display/nr-filter.h"
-
static void filter_ref_changed(SPObject *old_ref, SPObject *ref, SPFilter *filter);
static void filter_ref_modified(SPObject *href, guint flags, SPFilter *filter);
diff --git a/src/sp-filter.h b/src/sp-filter.h
index 0d087c5bf..e6318c569 100644
--- a/src/sp-filter.h
+++ b/src/sp-filter.h
@@ -12,6 +12,7 @@
#ifndef SP_FILTER_H_SEEN
#define SP_FILTER_H_SEEN
+#include <glibmm/ustring.h>
#include <map>
#include "number-opt-number.h"
@@ -19,8 +20,6 @@
#include "sp-filter-units.h"
#include "svg/svg-length.h"
-#include <glibmm/ustring.h>
-
#define SP_FILTER(obj) (dynamic_cast<SPFilter*>((SPObject*)obj))
#define SP_IS_FILTER(obj) (dynamic_cast<const SPFilter*>((SPObject*)obj) != NULL)
@@ -45,9 +44,9 @@ public:
virtual ~SPFilter();
SPFilterUnits filterUnits;
- guint filterUnits_set : 1;
+ unsigned int filterUnits_set : 1;
SPFilterUnits primitiveUnits;
- guint primitiveUnits_set : 1;
+ unsigned int primitiveUnits_set : 1;
SVGLength x;
SVGLength y;
SVGLength width;
@@ -68,11 +67,11 @@ protected:
virtual void child_added(Inkscape::XML::Node* child, Inkscape::XML::Node* ref);
virtual void remove_child(Inkscape::XML::Node* child);
- virtual void set(unsigned int key, const gchar* value);
+ virtual void set(unsigned int key, const char* value);
virtual void update(SPCtx* ctx, unsigned int flags);
- virtual Inkscape::XML::Node* write(Inkscape::XML::Document* doc, Inkscape::XML::Node* repr, guint flags);
+ virtual Inkscape::XML::Node* write(Inkscape::XML::Document* doc, Inkscape::XML::Node* repr, unsigned int flags);
};
void sp_filter_set_filter_units(SPFilter *filter, SPFilterUnits filterUnits);
@@ -88,14 +87,14 @@ void sp_filter_build_renderer(SPFilter *sp_filter, Inkscape::Filters::Filter *nr
int sp_filter_primitive_count(SPFilter *filter);
/// Returns a slot number for given image name, or -1 for unknown name.
-int sp_filter_get_image_name(SPFilter *filter, gchar const *name);
+int sp_filter_get_image_name(SPFilter *filter, char const *name);
/// Returns slot number for given image name, even if it's unknown.
-int sp_filter_set_image_name(SPFilter *filter, gchar const *name);
+int sp_filter_set_image_name(SPFilter *filter, char const *name);
/** Finds image name based on it's slot number. Returns 0 for unknown slot
* numbers. */
-gchar const *sp_filter_name_for_image(SPFilter const *filter, int const image);
+char const *sp_filter_name_for_image(SPFilter const *filter, int const image);
/// Returns a result image name that is not in use inside this filter.
Glib::ustring sp_filter_get_new_result_name(SPFilter *filter);
diff --git a/src/sp-flowdiv.h b/src/sp-flowdiv.h
index d00cfc51b..4a3690726 100644
--- a/src/sp-flowdiv.h
+++ b/src/sp-flowdiv.h
@@ -1,5 +1,5 @@
-#ifndef __SP_ITEM_FLOWDIV_H__
-#define __SP_ITEM_FLOWDIV_H__
+#ifndef SEEN_SP_ITEM_FLOWDIV_H
+#define SEEN_SP_ITEM_FLOWDIV_H
/*
*/
@@ -31,11 +31,11 @@ public:
protected:
virtual void build(SPDocument *document, Inkscape::XML::Node *repr);
virtual void release();
- virtual void update(SPCtx* ctx, guint flags);
+ virtual void update(SPCtx* ctx, unsigned int flags);
virtual void modified(unsigned int flags);
- virtual void set(unsigned int key, gchar const* value);
- virtual Inkscape::XML::Node* write(Inkscape::XML::Document *xml_doc, Inkscape::XML::Node *repr, guint flags);
+ virtual void set(unsigned int key, char const* value);
+ virtual Inkscape::XML::Node* write(Inkscape::XML::Document *xml_doc, Inkscape::XML::Node *repr, unsigned int flags);
};
class SPFlowtspan : public SPItem {
@@ -46,11 +46,11 @@ public:
protected:
virtual void build(SPDocument *document, Inkscape::XML::Node *repr);
virtual void release();
- virtual void update(SPCtx* ctx, guint flags);
+ virtual void update(SPCtx* ctx, unsigned int flags);
virtual void modified(unsigned int flags);
- virtual void set(unsigned int key, gchar const* value);
- virtual Inkscape::XML::Node* write(Inkscape::XML::Document *xml_doc, Inkscape::XML::Node *repr, guint flags);
+ virtual void set(unsigned int key, char const* value);
+ virtual Inkscape::XML::Node* write(Inkscape::XML::Document *xml_doc, Inkscape::XML::Node *repr, unsigned int flags);
};
class SPFlowpara : public SPItem {
@@ -61,11 +61,11 @@ public:
protected:
virtual void build(SPDocument *document, Inkscape::XML::Node *repr);
virtual void release();
- virtual void update(SPCtx* ctx, guint flags);
+ virtual void update(SPCtx* ctx, unsigned int flags);
virtual void modified(unsigned int flags);
- virtual void set(unsigned int key, gchar const* value);
- virtual Inkscape::XML::Node* write(Inkscape::XML::Document *xml_doc, Inkscape::XML::Node *repr, guint flags);
+ virtual void set(unsigned int key, char const* value);
+ virtual Inkscape::XML::Node* write(Inkscape::XML::Document *xml_doc, Inkscape::XML::Node *repr, unsigned int flags);
};
// these do not need any style
@@ -78,7 +78,7 @@ protected:
virtual void release();
virtual void modified(unsigned int flags);
- virtual Inkscape::XML::Node* write(Inkscape::XML::Document *xml_doc, Inkscape::XML::Node *repr, guint flags);
+ virtual Inkscape::XML::Node* write(Inkscape::XML::Document *xml_doc, Inkscape::XML::Node *repr, unsigned int flags);
};
class SPFlowregionbreak : public SPObject {
@@ -90,7 +90,7 @@ protected:
virtual void release();
virtual void modified(unsigned int flags);
- virtual Inkscape::XML::Node* write(Inkscape::XML::Document *xml_doc, Inkscape::XML::Node *repr, guint flags);
+ virtual Inkscape::XML::Node* write(Inkscape::XML::Document *xml_doc, Inkscape::XML::Node *repr, unsigned int flags);
};
#endif
diff --git a/src/sp-flowregion.h b/src/sp-flowregion.h
index 721eb0432..024a298b8 100644
--- a/src/sp-flowregion.h
+++ b/src/sp-flowregion.h
@@ -1,5 +1,5 @@
-#ifndef __SP_ITEM_FLOWREGION_H__
-#define __SP_ITEM_FLOWREGION_H__
+#ifndef SEEN_SP_ITEM_FLOWREGION_H
+#define SEEN_SP_ITEM_FLOWREGION_H
/*
*/
@@ -30,7 +30,7 @@ public:
virtual void remove_child(Inkscape::XML::Node *child);
virtual void update(SPCtx *ctx, unsigned int flags);
virtual void modified(guint flags);
- virtual Inkscape::XML::Node* write(Inkscape::XML::Document *xml_doc, Inkscape::XML::Node *repr, guint flags);
+ virtual Inkscape::XML::Node* write(Inkscape::XML::Document *xml_doc, Inkscape::XML::Node *repr, unsigned int flags);
virtual const char* displayName() const;
};
@@ -47,7 +47,7 @@ public:
virtual void remove_child(Inkscape::XML::Node *child);
virtual void update(SPCtx *ctx, unsigned int flags);
virtual void modified(guint flags);
- virtual Inkscape::XML::Node* write(Inkscape::XML::Document *xml_doc, Inkscape::XML::Node *repr, guint flags);
+ virtual Inkscape::XML::Node* write(Inkscape::XML::Document *xml_doc, Inkscape::XML::Node *repr, unsigned int flags);
virtual const char* displayName() const;
};
diff --git a/src/sp-flowtext.h b/src/sp-flowtext.h
index a5b7db22e..743d55030 100644
--- a/src/sp-flowtext.h
+++ b/src/sp-flowtext.h
@@ -4,10 +4,10 @@
/*
*/
-#include "sp-item.h"
-
#include <2geom/forward.h>
+
#include "libnrtype/Layout-TNG.h"
+#include "sp-item.h"
#define SP_FLOWTEXT(obj) (dynamic_cast<SPFlowtext*>((SPObject*)obj))
#define SP_IS_FLOWTEXT(obj) (dynamic_cast<const SPFlowtext*>((SPObject*)obj) != NULL)
@@ -63,18 +63,18 @@ public:
virtual void child_added(Inkscape::XML::Node* child, Inkscape::XML::Node* ref);
virtual void remove_child(Inkscape::XML::Node* child);
- virtual void set(unsigned int key, const gchar* value);
+ virtual void set(unsigned int key, const char* value);
virtual Geom::Affine set_transform(Geom::Affine const& xform);
virtual void update(SPCtx* ctx, unsigned int flags);
virtual void modified(unsigned int flags);
- virtual Inkscape::XML::Node* write(Inkscape::XML::Document* doc, Inkscape::XML::Node* repr, guint flags);
+ virtual Inkscape::XML::Node* write(Inkscape::XML::Document* doc, Inkscape::XML::Node* repr, unsigned int flags);
virtual Geom::OptRect bbox(Geom::Affine const &transform, SPItem::BBoxType type) const;
virtual void print(SPPrintContext *ctx);
virtual const char* displayName() const;
- virtual gchar* description() const;
+ virtual char* description() const;
virtual Inkscape::DrawingItem* show(Inkscape::Drawing &drawing, unsigned int key, unsigned int flags);
virtual void hide(unsigned int key);
virtual void snappoints(std::vector<Inkscape::SnapCandidatePoint> &p, Inkscape::SnapPreferences const *snapprefs) const;
diff --git a/src/sp-font-face.h b/src/sp-font-face.h
index 531dd5843..669b93197 100644
--- a/src/sp-font-face.h
+++ b/src/sp-font-face.h
@@ -1,9 +1,5 @@
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
-
-#ifndef __SP_FONTFACE_H__
-#define __SP_FONTFACE_H__
+#ifndef SEEN_SP_FONTFACE_H
+#define SEEN_SP_FONTFACE_H
#include <vector>
@@ -117,11 +113,11 @@ protected:
virtual void child_added(Inkscape::XML::Node* child, Inkscape::XML::Node* ref);
virtual void remove_child(Inkscape::XML::Node* child);
- virtual void set(unsigned int key, const gchar* value);
+ virtual void set(unsigned int key, const char* value);
virtual void update(SPCtx* ctx, unsigned int flags);
- virtual Inkscape::XML::Node* write(Inkscape::XML::Document* doc, Inkscape::XML::Node* repr, guint flags);
+ virtual Inkscape::XML::Node* write(Inkscape::XML::Document* doc, Inkscape::XML::Node* repr, unsigned int flags);
};
#endif //#ifndef __SP_FONTFACE_H__
diff --git a/src/sp-font.h b/src/sp-font.h
index 6e6f4eec2..6e26a02b2 100644
--- a/src/sp-font.h
+++ b/src/sp-font.h
@@ -1,7 +1,3 @@
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
-
#ifndef SP_FONT_H_SEEN
#define SP_FONT_H_SEEN
@@ -40,11 +36,11 @@ protected:
virtual void child_added(Inkscape::XML::Node* child, Inkscape::XML::Node* ref);
virtual void remove_child(Inkscape::XML::Node* child);
- virtual void set(unsigned int key, const gchar* value);
+ virtual void set(unsigned int key, char const* value);
virtual void update(SPCtx* ctx, unsigned int flags);
- virtual Inkscape::XML::Node* write(Inkscape::XML::Document* doc, Inkscape::XML::Node* repr, guint flags);
+ virtual Inkscape::XML::Node* write(Inkscape::XML::Document* doc, Inkscape::XML::Node* repr, unsigned int flags);
};
#endif //#ifndef SP_FONT_H_SEEN
diff --git a/src/sp-glyph-kerning.cpp b/src/sp-glyph-kerning.cpp
index be47c7621..f33d3c509 100644
--- a/src/sp-glyph-kerning.cpp
+++ b/src/sp-glyph-kerning.cpp
@@ -1,18 +1,12 @@
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
-
-#define __SP_ANCHOR_C__
-
-/*
+/**
* SVG <hkern> and <vkern> elements implementation
* W3C SVG 1.1 spec, page 476, section 20.7
*
- * Author:
+ * Authors:
* Felipe C. da S. Sanches <juca@members.fsf.org>
* Abhishek Sharma
*
- * Copyright (C) 2008, Felipe C. da S. Sanches
+ * Copyright (C) 2008 Authors
*
* Released under GNU GPL, read the file 'COPYING' for more information
*/
@@ -26,45 +20,49 @@
#include <cstring>
-SPGlyphKerning::SPGlyphKerning() : SPObject() {
+SPGlyphKerning::SPGlyphKerning()
+ : SPObject()
//TODO: correct these values:
- this->u1 = NULL;
- this->g1 = NULL;
- this->u2 = NULL;
- this->g2 = NULL;
- this->k = 0;
-}
-
-SPGlyphKerning::~SPGlyphKerning() {
+ , u1(NULL)
+ , g1(NULL)
+ , u2(NULL)
+ , g2(NULL)
+ , k(0)
+{
}
-void SPGlyphKerning::build(SPDocument *document, Inkscape::XML::Node *repr) {
- SPObject::build(document, repr);
+void SPGlyphKerning::build(SPDocument *document, Inkscape::XML::Node *repr)
+{
+ SPObject::build(document, repr);
- this->readAttr( "u1" );
- this->readAttr( "g1" );
- this->readAttr( "u2" );
- this->readAttr( "g2" );
- this->readAttr( "k" );
+ this->readAttr( "u1" );
+ this->readAttr( "g1" );
+ this->readAttr( "u2" );
+ this->readAttr( "g2" );
+ this->readAttr( "k" );
}
-void SPGlyphKerning::release() {
- SPObject::release();
+void SPGlyphKerning::release()
+{
+ SPObject::release();
}
-GlyphNames::GlyphNames(const gchar* value){
+GlyphNames::GlyphNames(const gchar* value)
+{
if (value) {
- this->names = strdup(value);
+ names = g_strdup(value);
}
}
-GlyphNames::~GlyphNames(){
- if (this->names) {
- g_free(this->names);
+GlyphNames::~GlyphNames()
+{
+ if (names) {
+ g_free(names);
}
}
-bool GlyphNames::contains(const char* name){
+bool GlyphNames::contains(const char* name)
+{
if (!(this->names) || !name) {
return false;
}
@@ -75,14 +73,15 @@ bool GlyphNames::contains(const char* name){
while (is >> str) {
if (str == s) {
- return true;
+ return true;
}
}
return false;
}
-void SPGlyphKerning::set(unsigned int key, const gchar *value) {
+void SPGlyphKerning::set(unsigned int key, const gchar *value)
+{
switch (key) {
case SP_ATTR_U1:
{
@@ -143,15 +142,16 @@ void SPGlyphKerning::set(unsigned int key, const gchar *value) {
}
/**
- * * Receives update notifications.
- * */
-void SPGlyphKerning::update(SPCtx *ctx, guint flags) {
+ * Receives update notifications.
+ */
+void SPGlyphKerning::update(SPCtx *ctx, guint flags)
+{
if (flags & SP_OBJECT_MODIFIED_FLAG) {
/* do something to trigger redisplay, updates? */
- this->readAttr( "u1" );
- this->readAttr( "u2" );
- this->readAttr( "g2" );
- this->readAttr( "k" );
+ this->readAttr( "u1" );
+ this->readAttr( "u2" );
+ this->readAttr( "g2" );
+ this->readAttr( "k" );
}
SPObject::update(ctx, flags);
@@ -159,37 +159,26 @@ void SPGlyphKerning::update(SPCtx *ctx, guint flags) {
#define COPY_ATTR(rd,rs,key) (rd)->setAttribute((key), rs->attribute(key));
-Inkscape::XML::Node* SPGlyphKerning::write(Inkscape::XML::Document *xml_doc, Inkscape::XML::Node *repr, guint flags) {
- if ((flags & SP_OBJECT_WRITE_BUILD) && !repr) {
- repr = xml_doc->createElement("svg:glyphkerning");//fix this!
- }
-
- /* I am commenting out this part because I am not certain how does it work. I will have to study it later. Juca
- repr->setAttribute("unicode", glyph->unicode);
- repr->setAttribute("glyph-name", glyph->glyph_name);
- repr->setAttribute("d", glyph->d);
- sp_repr_set_svg_double(repr, "orientation", (double) glyph->orientation);
- sp_repr_set_svg_double(repr, "arabic-form", (double) glyph->arabic_form);
- repr->setAttribute("lang", glyph->lang);
- sp_repr_set_svg_double(repr, "horiz-adv-x", glyph->horiz_adv_x);
- sp_repr_set_svg_double(repr, "vert-origin-x", glyph->vert_origin_x);
- sp_repr_set_svg_double(repr, "vert-origin-y", glyph->vert_origin_y);
- sp_repr_set_svg_double(repr, "vert-adv-y", glyph->vert_adv_y);
- */
- if (repr != this->getRepr()) {
- // All the COPY_ATTR functions below use
- // XML Tree directly, while they shouldn't.
- COPY_ATTR(repr, this->getRepr(), "u1");
- COPY_ATTR(repr, this->getRepr(), "g1");
- COPY_ATTR(repr, this->getRepr(), "u2");
- COPY_ATTR(repr, this->getRepr(), "g2");
- COPY_ATTR(repr, this->getRepr(), "k");
- }
-
- SPObject::write(xml_doc, repr, flags);
-
- return repr;
+Inkscape::XML::Node* SPGlyphKerning::write(Inkscape::XML::Document *xml_doc, Inkscape::XML::Node *repr, guint flags)
+{
+ if ((flags & SP_OBJECT_WRITE_BUILD) && !repr) {
+ repr = xml_doc->createElement("svg:glyphkerning"); // fix this!
+ }
+
+ if (repr != this->getRepr()) {
+ // All the COPY_ATTR functions below use
+ // XML Tree directly, while they shouldn't.
+ COPY_ATTR(repr, this->getRepr(), "u1");
+ COPY_ATTR(repr, this->getRepr(), "g1");
+ COPY_ATTR(repr, this->getRepr(), "u2");
+ COPY_ATTR(repr, this->getRepr(), "g2");
+ COPY_ATTR(repr, this->getRepr(), "k");
+ }
+ SPObject::write(xml_doc, repr, flags);
+
+ return repr;
}
+
/*
Local Variables:
mode:c++
diff --git a/src/sp-glyph-kerning.h b/src/sp-glyph-kerning.h
index 5cae6b9dd..c96c0b6e4 100644
--- a/src/sp-glyph-kerning.h
+++ b/src/sp-glyph-kerning.h
@@ -1,10 +1,3 @@
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
-
-#ifndef __SP_GLYPH_KERNING_H__
-#define __SP_GLYPH_KERNING_H__
-
/*
* SVG <hkern> and <vkern> elements implementation
*
@@ -16,41 +9,35 @@
* Released under GNU GPL, read the file 'COPYING' for more information
*/
+#ifndef SEEN_SP_GLYPH_KERNING_H
+#define SEEN_SP_GLYPH_KERNING_H
+
#include "sp-object.h"
#include "unicoderange.h"
-//#define SP_HKERN(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), SP_TYPE_HKERN, SPHkern))
-//#define SP_HKERN_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), SP_TYPE_HKERN, SPGlyphKerningClass))
-//#define SP_IS_HKERN(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), SP_TYPE_HKERN))
-//#define SP_IS_HKERN_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), SP_TYPE_HKERN))
+#define SP_HKERN(obj) (dynamic_cast<SPHkern*>(obj))
+#define SP_IS_HKERN(obj) (dynamic_cast<const SPHkern*>(obj) != NULL)
-#define SP_HKERN(obj) (dynamic_cast<SPHkern*>((SPObject*)obj))
-#define SP_IS_HKERN(obj) (dynamic_cast<const SPHkern*>((SPObject*)obj) != NULL)
-
-//#define SP_VKERN(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), SP_TYPE_VKERN, SPVkern))
-//#define SP_VKERN_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), SP_TYPE_VKERN, SPGlyphKerningClass))
-//#define SP_IS_VKERN(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), SP_TYPE_VKERN))
-//#define SP_IS_VKERN_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), SP_TYPE_VKERN))
-
-#define SP_VKERN(obj) (dynamic_cast<SPVkern*>((SPObject*)obj))
-#define SP_IS_VKERN(obj) (dynamic_cast<const SPVkern*>((SPObject*)obj) != NULL)
+#define SP_VKERN(obj) (dynamic_cast<SPVkern*>(obj))
+#define SP_IS_VKERN(obj) (dynamic_cast<const SPVkern*>(obj) != NULL)
// CPPIFY: These casting macros are buggy, as Vkern and Hkern aren't "real" classes.
-class GlyphNames{
+class GlyphNames {
public:
-GlyphNames(const gchar* value);
-~GlyphNames();
-bool contains(const char* name);
+ GlyphNames(char const* value);
+ ~GlyphNames();
+ bool contains(char const* name);
private:
-gchar* names;
+ char* names;
};
class SPGlyphKerning : public SPObject {
public:
- SPGlyphKerning();
- virtual ~SPGlyphKerning();
+ SPGlyphKerning();
+ virtual ~SPGlyphKerning() {}
+ // FIXME encapsulation
UnicodeRange* u1;
GlyphNames* g1;
UnicodeRange* u2;
@@ -58,22 +45,30 @@ public:
double k;
protected:
- virtual void build(SPDocument* doc, Inkscape::XML::Node* repr);
- virtual void release();
-
- virtual void set(unsigned int key, const gchar* value);
-
- virtual void update(SPCtx* ctx, unsigned int flags);
-
- virtual Inkscape::XML::Node* write(Inkscape::XML::Document* doc, Inkscape::XML::Node* repr, guint flags);
+ virtual void build(SPDocument* doc, Inkscape::XML::Node* repr);
+ virtual void release();
+ virtual void set(unsigned int key, char const* value);
+ virtual void update(SPCtx* ctx, unsigned int flags);
+ virtual Inkscape::XML::Node* write(Inkscape::XML::Document* doc, Inkscape::XML::Node* repr, unsigned int flags);
};
class SPHkern : public SPGlyphKerning {
-
+ virtual ~SPHkern() {}
};
class SPVkern : public SPGlyphKerning {
-
+ virtual ~SPVkern() {}
};
-#endif //#ifndef __SP_GLYPH_KERNING_H__
+#endif // !SEEN_SP_GLYPH_KERNING_H
+
+/*
+ Local Variables:
+ mode:c++
+ c-file-style:"stroustrup"
+ c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
+ indent-tabs-mode:nil
+ fill-column:99
+ End:
+*/
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8 :
diff --git a/src/sp-glyph.cpp b/src/sp-glyph.cpp
index 695af03ba..eaa69d486 100644
--- a/src/sp-glyph.cpp
+++ b/src/sp-glyph.cpp
@@ -2,8 +2,6 @@
# include <config.h>
#endif
-#define __SP_GLYPH_C__
-
/*
* SVG <glyph> element implementation
*
@@ -25,46 +23,44 @@
#include "sp-factory.h"
namespace {
- SPObject* createGlyph() {
- return new SPGlyph();
- }
-
- bool glyphRegistered = SPFactory::instance().registerObject("svg:glyph", createGlyph);
+ SPObject* createGlyph() {
+ return new SPGlyph();
+ }
+ bool glyphRegistered = SPFactory::instance().registerObject("svg:glyph", createGlyph);
}
-SPGlyph::SPGlyph() : SPObject() {
+SPGlyph::SPGlyph()
+ : SPObject()
//TODO: correct these values:
-
- this->d = NULL;
- this->orientation = GLYPH_ORIENTATION_BOTH;
- this->arabic_form = GLYPH_ARABIC_FORM_INITIAL;
- this->lang = NULL;
- this->horiz_adv_x = 0;
- this->vert_origin_x = 0;
- this->vert_origin_y = 0;
- this->vert_adv_y = 0;
-}
-
-SPGlyph::~SPGlyph() {
+ , d(NULL)
+ , orientation(GLYPH_ORIENTATION_BOTH)
+ , arabic_form(GLYPH_ARABIC_FORM_INITIAL)
+ , lang(NULL)
+ , horiz_adv_x(0)
+ , vert_origin_x(0)
+ , vert_origin_y(0)
+ , vert_adv_y(0)
+{
}
-void SPGlyph::build(SPDocument *document, Inkscape::XML::Node *repr) {
- SPObject::build(document, repr);
+void SPGlyph::build(SPDocument *document, Inkscape::XML::Node *repr)
+{
+ SPObject::build(document, repr);
- this->readAttr( "unicode" );
- this->readAttr( "glyph-name" );
- this->readAttr( "d" );
- this->readAttr( "orientation" );
- this->readAttr( "arabic-form" );
- this->readAttr( "lang" );
- this->readAttr( "horiz-adv-x" );
- this->readAttr( "vert-origin-x" );
- this->readAttr( "vert-origin-y" );
- this->readAttr( "vert-adv-y" );
+ this->readAttr( "unicode" );
+ this->readAttr( "glyph-name" );
+ this->readAttr( "d" );
+ this->readAttr( "orientation" );
+ this->readAttr( "arabic-form" );
+ this->readAttr( "lang" );
+ this->readAttr( "horiz-adv-x" );
+ this->readAttr( "vert-origin-x" );
+ this->readAttr( "vert-origin-y" );
+ this->readAttr( "vert-adv-y" );
}
void SPGlyph::release() {
- SPObject::release();
+ SPObject::release();
}
static glyphArabicForm sp_glyph_read_arabic_form(gchar const *value){
@@ -97,7 +93,8 @@ static glyphArabicForm sp_glyph_read_arabic_form(gchar const *value){
return GLYPH_ARABIC_FORM_INITIAL; //TODO: VERIFY DEFAULT!
}
-static glyphOrientation sp_glyph_read_orientation(gchar const *value){
+static glyphOrientation sp_glyph_read_orientation(gchar const *value)
+{
if (!value) {
return GLYPH_ORIENTATION_BOTH;
}
@@ -115,7 +112,8 @@ static glyphOrientation sp_glyph_read_orientation(gchar const *value){
return GLYPH_ORIENTATION_BOTH;
}
-void SPGlyph::set(unsigned int key, const gchar *value) {
+void SPGlyph::set(unsigned int key, const gchar *value)
+{
switch (key) {
case SP_ATTR_UNICODE:
{
@@ -228,21 +226,22 @@ void SPGlyph::set(unsigned int key, const gchar *value) {
}
/**
- * * Receives update notifications.
- * */
-void SPGlyph::update(SPCtx *ctx, guint flags) {
+ * Receives update notifications.
+ */
+void SPGlyph::update(SPCtx *ctx, guint flags)
+{
if (flags & SP_OBJECT_MODIFIED_FLAG) {
/* do something to trigger redisplay, updates? */
- this->readAttr( "unicode" );
- this->readAttr( "glyph-name" );
- this->readAttr( "d" );
- this->readAttr( "orientation" );
- this->readAttr( "arabic-form" );
- this->readAttr( "lang" );
- this->readAttr( "horiz-adv-x" );
- this->readAttr( "vert-origin-x" );
- this->readAttr( "vert-origin-y" );
- this->readAttr( "vert-adv-y" );
+ this->readAttr( "unicode" );
+ this->readAttr( "glyph-name" );
+ this->readAttr( "d" );
+ this->readAttr( "orientation" );
+ this->readAttr( "arabic-form" );
+ this->readAttr( "lang" );
+ this->readAttr( "horiz-adv-x" );
+ this->readAttr( "vert-origin-x" );
+ this->readAttr( "vert-origin-y" );
+ this->readAttr( "vert-adv-y" );
}
SPObject::update(ctx, flags);
@@ -250,42 +249,45 @@ void SPGlyph::update(SPCtx *ctx, guint flags) {
#define COPY_ATTR(rd,rs,key) (rd)->setAttribute((key), rs->attribute(key));
-Inkscape::XML::Node* SPGlyph::write(Inkscape::XML::Document *xml_doc, Inkscape::XML::Node *repr, guint flags) {
- if ((flags & SP_OBJECT_WRITE_BUILD) && !repr) {
- repr = xml_doc->createElement("svg:glyph");
- }
+Inkscape::XML::Node* SPGlyph::write(Inkscape::XML::Document *xml_doc, Inkscape::XML::Node *repr, guint flags)
+{
+ if ((flags & SP_OBJECT_WRITE_BUILD) && !repr) {
+ repr = xml_doc->createElement("svg:glyph");
+ }
- /* I am commenting out this part because I am not certain how does it work. I will have to study it later. Juca
- repr->setAttribute("unicode", glyph->unicode);
- repr->setAttribute("glyph-name", glyph->glyph_name);
- repr->setAttribute("d", glyph->d);
- sp_repr_set_svg_double(repr, "orientation", (double) glyph->orientation);
- sp_repr_set_svg_double(repr, "arabic-form", (double) glyph->arabic_form);
- repr->setAttribute("lang", glyph->lang);
- sp_repr_set_svg_double(repr, "horiz-adv-x", glyph->horiz_adv_x);
- sp_repr_set_svg_double(repr, "vert-origin-x", glyph->vert_origin_x);
- sp_repr_set_svg_double(repr, "vert-origin-y", glyph->vert_origin_y);
- sp_repr_set_svg_double(repr, "vert-adv-y", glyph->vert_adv_y);
- */
- if (repr != this->getRepr()) {
- // All the COPY_ATTR functions below use
- // XML Tree directly while they shouldn't.
- COPY_ATTR(repr, this->getRepr(), "unicode");
- COPY_ATTR(repr, this->getRepr(), "glyph-name");
- COPY_ATTR(repr, this->getRepr(), "d");
- COPY_ATTR(repr, this->getRepr(), "orientation");
- COPY_ATTR(repr, this->getRepr(), "arabic-form");
- COPY_ATTR(repr, this->getRepr(), "lang");
- COPY_ATTR(repr, this->getRepr(), "horiz-adv-x");
- COPY_ATTR(repr, this->getRepr(), "vert-origin-x");
- COPY_ATTR(repr, this->getRepr(), "vert-origin-y");
- COPY_ATTR(repr, this->getRepr(), "vert-adv-y");
- }
+ /* I am commenting out this part because I am not certain how does it work. I will have to study it later. Juca
+ repr->setAttribute("unicode", glyph->unicode);
+ repr->setAttribute("glyph-name", glyph->glyph_name);
+ repr->setAttribute("d", glyph->d);
+ sp_repr_set_svg_double(repr, "orientation", (double) glyph->orientation);
+ sp_repr_set_svg_double(repr, "arabic-form", (double) glyph->arabic_form);
+ repr->setAttribute("lang", glyph->lang);
+ sp_repr_set_svg_double(repr, "horiz-adv-x", glyph->horiz_adv_x);
+ sp_repr_set_svg_double(repr, "vert-origin-x", glyph->vert_origin_x);
+ sp_repr_set_svg_double(repr, "vert-origin-y", glyph->vert_origin_y);
+ sp_repr_set_svg_double(repr, "vert-adv-y", glyph->vert_adv_y);
+ */
- SPObject::write(xml_doc, repr, flags);
+ if (repr != this->getRepr()) {
+ // All the COPY_ATTR functions below use
+ // XML Tree directly while they shouldn't.
+ COPY_ATTR(repr, this->getRepr(), "unicode");
+ COPY_ATTR(repr, this->getRepr(), "glyph-name");
+ COPY_ATTR(repr, this->getRepr(), "d");
+ COPY_ATTR(repr, this->getRepr(), "orientation");
+ COPY_ATTR(repr, this->getRepr(), "arabic-form");
+ COPY_ATTR(repr, this->getRepr(), "lang");
+ COPY_ATTR(repr, this->getRepr(), "horiz-adv-x");
+ COPY_ATTR(repr, this->getRepr(), "vert-origin-x");
+ COPY_ATTR(repr, this->getRepr(), "vert-origin-y");
+ COPY_ATTR(repr, this->getRepr(), "vert-adv-y");
+ }
- return repr;
+ SPObject::write(xml_doc, repr, flags);
+
+ return repr;
}
+
/*
Local Variables:
mode:c++
diff --git a/src/sp-glyph.h b/src/sp-glyph.h
index 798d9ff2f..297ac930e 100644
--- a/src/sp-glyph.h
+++ b/src/sp-glyph.h
@@ -1,13 +1,4 @@
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
-
-#ifndef __SP_GLYPH_H__
-#define __SP_GLYPH_H__
-
-/*
- * SVG <glyph> element implementation
- *
+/**
* Authors:
* Felipe C. da S. Sanches <juca@members.fsf.org>
*
@@ -16,6 +7,9 @@
* Released under GNU GPL, read the file 'COPYING' for more information
*/
+#ifndef SEEN_SP_GLYPH_H
+#define SEEN_SP_GLYPH_H
+
#include "sp-object.h"
#define SP_GLYPH(obj) (dynamic_cast<SPGlyph*>((SPObject*)obj))
@@ -34,11 +28,16 @@ enum glyphOrientation {
GLYPH_ORIENTATION_BOTH
};
+/*
+ * SVG <glyph> element
+ */
+
class SPGlyph : public SPObject {
public:
- SPGlyph();
- virtual ~SPGlyph();
+ SPGlyph();
+ virtual ~SPGlyph() {}
+ // FIXME encapsulation
Glib::ustring unicode;
Glib::ustring glyph_name;
char* d;
@@ -51,14 +50,23 @@ public:
double vert_adv_y;
protected:
- virtual void build(SPDocument* doc, Inkscape::XML::Node* repr);
- virtual void release();
-
- virtual void set(unsigned int key, const gchar* value);
+ virtual void build(SPDocument* doc, Inkscape::XML::Node* repr);
+ virtual void release();
+ virtual void set(unsigned int key, const char* value);
+ virtual void update(SPCtx* ctx, unsigned int flags);
+ virtual Inkscape::XML::Node* write(Inkscape::XML::Document* doc, Inkscape::XML::Node* repr, unsigned int flags);
- virtual void update(SPCtx* ctx, unsigned int flags);
-
- virtual Inkscape::XML::Node* write(Inkscape::XML::Document* doc, Inkscape::XML::Node* repr, guint flags);
};
-#endif //#ifndef __SP_GLYPH_H__
+#endif // !SEEN_SP_GLYPH_H
+
+/*
+ Local Variables:
+ mode:c++
+ c-file-style:"stroustrup"
+ c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
+ indent-tabs-mode:nil
+ fill-column:99
+ End:
+*/
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8 :
diff --git a/src/sp-gradient-vector.h b/src/sp-gradient-vector.h
index 8e860c169..e57820b56 100644
--- a/src/sp-gradient-vector.h
+++ b/src/sp-gradient-vector.h
@@ -1,7 +1,6 @@
#ifndef SEEN_SP_GRADIENT_VECTOR_H
#define SEEN_SP_GRADIENT_VECTOR_H
-#include <glib.h>
#include <vector>
#include "color.h"
@@ -14,9 +13,9 @@
* copying from SPStop to SPGradientStop.
*/
struct SPGradientStop {
- gdouble offset;
+ double offset;
SPColor color;
- gfloat opacity;
+ float opacity;
};
/**
diff --git a/src/sp-gradient.cpp b/src/sp-gradient.cpp
index 70c54451a..b3e885560 100644
--- a/src/sp-gradient.cpp
+++ b/src/sp-gradient.cpp
@@ -54,9 +54,6 @@
#include "style.h"
#include "display/grayscale.h"
-#define SP_MACROS_SILENT
-#include "macros.h"
-
/// Has to be power of 2 Seems to be unused.
//#define NCOLORS NR_GRADIENT_VECTOR_LENGTH
@@ -107,11 +104,11 @@ void SPGradient::setSwatch( bool swatch )
* Equivalent meaning they have the same stop count, same stop colors and same stop opacity
* @param that - A gradient to compare this to
*/
-gboolean SPGradient::isEquivalent(SPGradient *that)
+bool SPGradient::isEquivalent(SPGradient *that)
{
//TODO Make this work for mesh gradients
- bool status = FALSE;
+ bool status = false;
while(1){ // not really a loop, used to avoid deep nesting or multiple exit points from function
if (this->getStopCount() != that->getStopCount()) { break; }
@@ -132,11 +129,11 @@ gboolean SPGradient::isEquivalent(SPGradient *that)
SPStop *as = this->getVector()->getFirstStop();
SPStop *bs = that->getVector()->getFirstStop();
- bool effective = TRUE;
+ bool effective = true;
while (effective && (as && bs)) {
if (!as->getEffectiveColor().isClose(bs->getEffectiveColor(), 0.001) ||
as->offset != bs->offset) {
- effective = FALSE;
+ effective = false;
break;
}
else {
@@ -144,9 +141,9 @@ gboolean SPGradient::isEquivalent(SPGradient *that)
bs = bs->getNextStop();
}
}
- if(!effective)break;
+ if (!effective) break;
- status = TRUE;
+ status = true;
break;
}
return status;
@@ -157,9 +154,9 @@ gboolean SPGradient::isEquivalent(SPGradient *that)
* Aligned means that they have exactly the same coordinates and transform.
* @param that - A gradient to compare this to
*/
-gboolean SPGradient::isAligned(SPGradient *that)
+bool SPGradient::isAligned(SPGradient *that)
{
- bool status = FALSE;
+ bool status = false;
/* Some gradients have coordinates/other values specified, some don't.
yes/yes check the coordinates/other values
@@ -223,7 +220,7 @@ gboolean SPGradient::isAligned(SPGradient *that)
} else {
break;
}
- status = TRUE;
+ status = true;
break;
}
return status;
diff --git a/src/sp-gradient.h b/src/sp-gradient.h
index 1dfff22ee..fbb48df62 100644
--- a/src/sp-gradient.h
+++ b/src/sp-gradient.h
@@ -14,30 +14,18 @@
* Released under GNU GPL, read the file 'COPYING' for more information
*/
-#include <vector>
-#include <gdk/gdk.h>
-#include <glibmm/ustring.h>
#include <2geom/affine.h>
+#include <cstddef>
+#include <glibmm/ustring.h>
+#include <sigc++/connection.h>
+#include <vector>
+
#include "sp-paint-server.h"
#include "sp-gradient-spread.h"
#include "sp-gradient-units.h"
#include "sp-gradient-vector.h"
#include "sp-mesh-array.h"
-#include <stddef.h>
-#include <sigc++/connection.h>
-
-
-
-//#include <glib.h>
-//#include <glib-object.h>
-//#include <2geom/forward.h>
-//#include "sp-gradient-spread.h"
-//#include "sp-gradient-units.h"
-//
-//class SPGradient;
-//struct SPMeshGradient;
-
class SPGradientReference;
class SPStop;
@@ -109,30 +97,30 @@ public:
private:
/** gradientUnits attribute */
SPGradientUnits units;
- guint units_set : 1;
+ unsigned int units_set : 1;
public:
/** gradientTransform attribute */
Geom::Affine gradientTransform;
- guint gradientTransform_set : 1;
+ unsigned int gradientTransform_set : 1;
private:
/** spreadMethod attribute */
SPGradientSpread spread;
- guint spread_set : 1;
+ unsigned int spread_set : 1;
/** Gradient stops */
- guint has_stops : 1;
+ unsigned int has_stops : 1;
/** Gradient patches */
- guint has_patches : 1;
+ unsigned int has_patches : 1;
public:
/** Reference (href) */
SPGradientReference *ref;
/** State in Inkscape gradient system */
- guint state;
+ unsigned int state;
/** Linear and Radial Gradients */
@@ -146,8 +134,8 @@ public:
SPStop* getFirstStop();
int getStopCount() const;
- gboolean isEquivalent(SPGradient *b);
- gboolean isAligned(SPGradient *b);
+ bool isEquivalent(SPGradient *b);
+ bool isAligned(SPGradient *b);
/** Mesh Gradients **************/
@@ -175,7 +163,7 @@ public:
*/
SPGradient *getVector(bool force_private = false);
- static GType getType();
+ //static GType getType();
/** Forces vector to be built, if not present (i.e. changed) */
void ensureVector();
@@ -196,7 +184,7 @@ public:
void setSwatch(bool swatch = true);
- static void gradientRefModified(SPObject *href, guint flags, SPGradient *gradient);
+ static void gradientRefModified(SPObject *href, unsigned int flags, SPGradient *gradient);
static void gradientRefChanged(SPObject *old_ref, SPObject *ref, SPGradient *gr);
private:
@@ -208,13 +196,13 @@ private:
protected:
virtual void build(SPDocument *document, Inkscape::XML::Node *repr);
virtual void release();
- virtual void modified(guint flags);
- virtual Inkscape::XML::Node* write(Inkscape::XML::Document *xml_doc, Inkscape::XML::Node *repr, guint flags);
+ virtual void modified(unsigned int flags);
+ virtual Inkscape::XML::Node* write(Inkscape::XML::Document *xml_doc, Inkscape::XML::Node *repr, unsigned int flags);
virtual void child_added(Inkscape::XML::Node *child, Inkscape::XML::Node *ref);
virtual void remove_child(Inkscape::XML::Node *child);
- virtual void set(unsigned key, gchar const *value);
+ virtual void set(unsigned key, char const *value);
};
void
diff --git a/src/sp-guide-constraint.h b/src/sp-guide-constraint.h
index ebc3b01ce..29f47f45a 100644
--- a/src/sp-guide-constraint.h
+++ b/src/sp-guide-constraint.h
@@ -29,10 +29,8 @@ public:
}
};
-
#endif // SEEN_SP_GUIDE_CONSTRAINT_H
-
/*
Local Variables:
mode:c++
diff --git a/src/sp-guide.cpp b/src/sp-guide.cpp
index 60f15a79d..581c8a440 100644
--- a/src/sp-guide.cpp
+++ b/src/sp-guide.cpp
@@ -46,117 +46,38 @@
using Inkscape::DocumentUndo;
using std::vector;
-//enum {
-// PROP_0,
-// PROP_COLOR,
-// PROP_HICOLOR
-//};
-//
-//static void sp_guide_set_property(GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec);
-//static void sp_guide_get_property(GObject *object, guint prop_id, GValue *value, GParamSpec *pspec);
-
#include "sp-factory.h"
namespace {
- SPObject* createGuide() {
- return new SPGuide();
- }
-
- bool guideRegistered = SPFactory::instance().registerObject("sodipodi:guide", createGuide);
-}
-
-//static void sp_guide_class_init(SPGuideClass *gc)
-//{
-// GObjectClass *gobject_class = (GObjectClass *) gc;
-//
-// gobject_class->set_property = sp_guide_set_property;
-// gobject_class->get_property = sp_guide_get_property;
-//
-// g_object_class_install_property(gobject_class,
-// PROP_COLOR,
-// g_param_spec_uint("color", "Color", "Color",
-// 0,
-// 0xffffffff,
-// 0xff000000,
-// (GParamFlags) G_PARAM_READWRITE));
-//
-// g_object_class_install_property(gobject_class,
-// PROP_HICOLOR,
-// g_param_spec_uint("hicolor", "HiColor", "HiColor",
-// 0,
-// 0xffffffff,
-// 0xff000000,
-// (GParamFlags) G_PARAM_READWRITE));
-//}
-// CPPIFY: properties!
-
-SPGuide::SPGuide() : SPObject() {
- this->label = NULL;
- this->views = NULL;
-
- this->normal_to_line = Geom::Point(0.,1.);
- this->point_on_line = Geom::Point(0.,0.);
- this->color = 0x0000ff7f;
- this->hicolor = 0xff00007f;
-}
-
-SPGuide::~SPGuide() {
-}
-
-guint32 SPGuide::getColor() const {
- return color;
-}
+ SPObject* createGuide() {
+ return new SPGuide();
+ }
-guint32 SPGuide::getHiColor() const {
- return hicolor;
+ bool guideRegistered = SPFactory::instance().registerObject("sodipodi:guide", createGuide);
}
-void SPGuide::setColor(guint32 c) {
- color = c;
-
- for (GSList *l = this->views; l != NULL; l = l->next) {
- sp_guideline_set_color(SP_GUIDELINE(l->data), this->color);
- }
-}
+SPGuide::SPGuide()
+ : SPObject()
+ , label(NULL)
+ , views(NULL)
+ , normal_to_line(Geom::Point(0.,1.))
+ , point_on_line(Geom::Point(0.,0.))
+ , color(0x0000ff7f)
+ , hicolor(0xff00007f)
+{}
+
+void SPGuide::setColor(guint32 c)
+{
+ color = c;
-void SPGuide::setHiColor(guint32 h) {
- this->hicolor = h;
+ for (GSList *l = this->views; l != NULL; l = l->next) {
+ sp_guideline_set_color(SP_GUIDELINE(l->data), this->color);
+ }
}
-//static void sp_guide_set_property(GObject *object, guint prop_id, const GValue *value, GParamSpec */*pspec*/)
-//{
-// SPGuide &guide = *SP_GUIDE(object);
-//
-// switch (prop_id) {
-// case PROP_COLOR:
-// guide.color = g_value_get_uint(value);
-// for (GSList *l = guide.views; l != NULL; l = l->next) {
-// sp_guideline_set_color(SP_GUIDELINE(l->data), guide.color);
-// }
-// break;
-//
-// case PROP_HICOLOR:
-// guide.hicolor = g_value_get_uint(value);
-// break;
-// }
-//}
-//
-//static void sp_guide_get_property(GObject *object, guint prop_id, GValue *value, GParamSpec */*pspec*/)
-//{
-// SPGuide const &guide = *SP_GUIDE(object);
-//
-// switch (prop_id) {
-// case PROP_COLOR:
-// g_value_set_uint(value, guide.color);
-// break;
-// case PROP_HICOLOR:
-// g_value_set_uint(value, guide.hicolor);
-// break;
-// }
-//}
-
-void SPGuide::build(SPDocument *document, Inkscape::XML::Node *repr) {
- SPObject::build(document, repr);
+void SPGuide::build(SPDocument *document, Inkscape::XML::Node *repr)
+{
+ SPObject::build(document, repr);
this->readAttr( "inkscape:label" );
this->readAttr( "orientation" );
@@ -166,7 +87,8 @@ void SPGuide::build(SPDocument *document, Inkscape::XML::Node *repr) {
document->addResource("guide", this);
}
-void SPGuide::release() {
+void SPGuide::release()
+{
while (this->views) {
sp_guideline_delete(SP_GUIDELINE(this->views->data));
this->views = g_slist_remove(this->views, this->views->data);
@@ -191,67 +113,67 @@ void SPGuide::set(unsigned int key, const gchar *value) {
this->label = NULL;
}
- sp_guide_set_label(*this, this->label, false);
+ this->set_label(this->label, false);
break;
case SP_ATTR_ORIENTATION:
- {
- if (value && !strcmp(value, "horizontal")) {
- /* Visual representation of a horizontal line, constrain vertically (y coordinate). */
- this->normal_to_line = Geom::Point(0., 1.);
- } else if (value && !strcmp(value, "vertical")) {
- this->normal_to_line = Geom::Point(1., 0.);
- } else if (value) {
- gchar ** strarray = g_strsplit(value, ",", 2);
- double newx, newy;
- unsigned int success = sp_svg_number_read_d(strarray[0], &newx);
- success += sp_svg_number_read_d(strarray[1], &newy);
- g_strfreev (strarray);
- if (success == 2 && (fabs(newx) > 1e-6 || fabs(newy) > 1e-6)) {
- Geom::Point direction(newx, newy);
- direction.normalize();
- this->normal_to_line = direction;
- } else {
- // default to vertical line for bad arguments
- this->normal_to_line = Geom::Point(1., 0.);
- }
+ {
+ if (value && !strcmp(value, "horizontal")) {
+ /* Visual representation of a horizontal line, constrain vertically (y coordinate). */
+ this->normal_to_line = Geom::Point(0., 1.);
+ } else if (value && !strcmp(value, "vertical")) {
+ this->normal_to_line = Geom::Point(1., 0.);
+ } else if (value) {
+ gchar ** strarray = g_strsplit(value, ",", 2);
+ double newx, newy;
+ unsigned int success = sp_svg_number_read_d(strarray[0], &newx);
+ success += sp_svg_number_read_d(strarray[1], &newy);
+ g_strfreev (strarray);
+ if (success == 2 && (fabs(newx) > 1e-6 || fabs(newy) > 1e-6)) {
+ Geom::Point direction(newx, newy);
+ direction.normalize();
+ this->normal_to_line = direction;
} else {
// default to vertical line for bad arguments
this->normal_to_line = Geom::Point(1., 0.);
}
- sp_guide_set_normal(*this, this->normal_to_line, false);
+ } else {
+ // default to vertical line for bad arguments
+ this->normal_to_line = Geom::Point(1., 0.);
}
- break;
+ this->set_normal(this->normal_to_line, false);
+ }
+ break;
case SP_ATTR_POSITION:
- {
- if (value) {
- gchar ** strarray = g_strsplit(value, ",", 2);
- double newx, newy;
- unsigned int success = sp_svg_number_read_d(strarray[0], &newx);
- success += sp_svg_number_read_d(strarray[1], &newy);
- g_strfreev (strarray);
- if (success == 2) {
- this->point_on_line = Geom::Point(newx, newy);
- } else if (success == 1) {
- // before 0.46 style guideline definition.
- const gchar *attr = this->getRepr()->attribute("orientation");
- if (attr && !strcmp(attr, "horizontal")) {
- this->point_on_line = Geom::Point(0, newx);
- } else {
- this->point_on_line = Geom::Point(newx, 0);
- }
+ {
+ if (value) {
+ gchar ** strarray = g_strsplit(value, ",", 2);
+ double newx, newy;
+ unsigned int success = sp_svg_number_read_d(strarray[0], &newx);
+ success += sp_svg_number_read_d(strarray[1], &newy);
+ g_strfreev (strarray);
+ if (success == 2) {
+ this->point_on_line = Geom::Point(newx, newy);
+ } else if (success == 1) {
+ // before 0.46 style guideline definition.
+ const gchar *attr = this->getRepr()->attribute("orientation");
+ if (attr && !strcmp(attr, "horizontal")) {
+ this->point_on_line = Geom::Point(0, newx);
+ } else {
+ this->point_on_line = Geom::Point(newx, 0);
}
- } else {
- // default to (0,0) for bad arguments
- this->point_on_line = Geom::Point(0,0);
}
- // update position in non-committing way
- // fixme: perhaps we need to add an update method instead, and request_update here
- sp_guide_moveto(*this, this->point_on_line, false);
+ } else {
+ // default to (0,0) for bad arguments
+ this->point_on_line = Geom::Point(0,0);
}
- break;
+ // update position in non-committing way
+ // fixme: perhaps we need to add an update method instead, and request_update here
+ this->moveto(this->point_on_line, false);
+ }
+ break;
default:
SPObject::set(key, value);
- break;
+ break;
}
}
@@ -276,15 +198,15 @@ SPGuide *SPGuide::createSPGuide(SPDocument *doc, Geom::Point const &pt1, Geom::P
return guide;
}
-void
-sp_guide_pt_pairs_to_guides(SPDocument *doc, std::list<std::pair<Geom::Point, Geom::Point> > &pts) {
+void sp_guide_pt_pairs_to_guides(SPDocument *doc, std::list<std::pair<Geom::Point, Geom::Point> > &pts)
+{
for (std::list<std::pair<Geom::Point, Geom::Point> >::iterator i = pts.begin(); i != pts.end(); ++i) {
SPGuide::createSPGuide(doc, (*i).first, (*i).second);
}
}
-void
-sp_guide_create_guides_around_page(SPDesktop *dt) {
+void sp_guide_create_guides_around_page(SPDesktop *dt)
+{
SPDocument *doc=sp_desktop_document(dt);
std::list<std::pair<Geom::Point, Geom::Point> > pts;
@@ -303,8 +225,8 @@ sp_guide_create_guides_around_page(SPDesktop *dt) {
DocumentUndo::done(doc, SP_VERB_NONE, _("Create Guides Around the Page"));
}
-void
-sp_guide_delete_all_guides(SPDesktop *dt) {
+void sp_guide_delete_all_guides(SPDesktop *dt)
+{
SPDocument *doc=sp_desktop_document(dt);
const GSList *current;
while ( (current = doc->getResourceList("guide")) ) {
@@ -325,6 +247,14 @@ void SPGuide::showSPGuide(SPCanvasGroup *group, GCallback handler)
views = g_slist_prepend(views, item);
}
+void SPGuide::showSPGuide()
+{
+ for (GSList *v = views; v != NULL; v = v->next) {
+ sp_canvas_item_show(SP_CANVAS_ITEM(v->data));
+ sp_canvas_item_show(SP_CANVAS_ITEM(SP_GUIDELINE(v->data)->origin));
+ }
+}
+
void SPGuide::hideSPGuide(SPCanvas *canvas)
{
g_assert(canvas != NULL);
@@ -338,10 +268,18 @@ void SPGuide::hideSPGuide(SPCanvas *canvas)
}
}
- g_assert_not_reached();
+ assert(false);
+}
+
+void SPGuide::hideSPGuide()
+{
+ for (GSList *v = views; v != NULL; v = v->next) {
+ sp_canvas_item_hide(SP_CANVAS_ITEM(v->data));
+ sp_canvas_item_hide(SP_CANVAS_ITEM(SP_GUIDELINE(v->data)->origin));
+ }
}
-void SPGuide::sensitize(SPCanvas *canvas, gboolean sensitive)
+void SPGuide::sensitize(SPCanvas *canvas, bool sensitive)
{
g_assert(canvas != NULL);
g_assert(SP_IS_CANVAS(canvas));
@@ -353,7 +291,7 @@ void SPGuide::sensitize(SPCanvas *canvas, gboolean sensitive)
}
}
- g_assert_not_reached();
+ assert(false);
}
Geom::Point SPGuide::getPositionFrom(Geom::Point const &pt) const
@@ -371,11 +309,9 @@ double SPGuide::getDistanceFrom(Geom::Point const &pt) const
* true indicates a "committing" version: in response to button release event after
* dragging a guideline, or clicking OK in guide editing dialog.
*/
-void sp_guide_moveto(SPGuide &guide, Geom::Point const point_on_line, bool const commit)
+void SPGuide::moveto(Geom::Point const point_on_line, bool const commit)
{
- g_assert(SP_IS_GUIDE(&guide));
-
- for (GSList *l = guide.views; l != NULL; l = l->next) {
+ for (GSList *l = views; l != NULL; l = l->next) {
sp_guideline_set_position(SP_GUIDELINE(l->data), point_on_line);
}
@@ -383,16 +319,16 @@ void sp_guide_moveto(SPGuide &guide, Geom::Point const point_on_line, bool const
case, so that the guide's new position is available for sp_item_rm_unsatisfied_cns. */
if (commit) {
//XML Tree being used here directly while it shouldn't be.
- sp_repr_set_point(guide.getRepr(), "position", point_on_line);
+ sp_repr_set_point(getRepr(), "position", point_on_line);
}
/* DISABLED CODE BECAUSE SPGuideAttachment IS NOT USE AT THE MOMENT (johan)
- for (vector<SPGuideAttachment>::const_iterator i(guide.attached_items.begin()),
- iEnd(guide.attached_items.end());
+ for (vector<SPGuideAttachment>::const_iterator i(attached_items.begin()),
+ iEnd(attached_items.end());
i != iEnd; ++i)
{
SPGuideAttachment const &att = *i;
- sp_item_notify_moveto(*att.item, guide, att.snappoint_ix, position, commit);
+ sp_item_notify_moveto(*att.item, this, att.snappoint_ix, position, commit);
}
*/
}
@@ -402,11 +338,9 @@ void sp_guide_moveto(SPGuide &guide, Geom::Point const point_on_line, bool const
* true indicates a "committing" version: in response to button release event after
* dragging a guideline, or clicking OK in guide editing dialog.
*/
-void sp_guide_set_normal(SPGuide &guide, Geom::Point const normal_to_line, bool const commit)
+void SPGuide::set_normal(Geom::Point const normal_to_line, bool const commit)
{
- g_assert(SP_IS_GUIDE(&guide));
-
- for (GSList *l = guide.views; l != NULL; l = l->next) {
+ for (GSList *l = this->views; l != NULL; l = l->next) {
sp_guideline_set_normal(SP_GUIDELINE(l->data), normal_to_line);
}
@@ -414,47 +348,45 @@ void sp_guide_set_normal(SPGuide &guide, Geom::Point const normal_to_line, bool
case, so that the guide's new position is available for sp_item_rm_unsatisfied_cns. */
if (commit) {
//XML Tree being used directly while it shouldn't be
- sp_repr_set_point(guide.getRepr(), "orientation", normal_to_line);
+ sp_repr_set_point(getRepr(), "orientation", normal_to_line);
}
/* DISABLED CODE BECAUSE SPGuideAttachment IS NOT USE AT THE MOMENT (johan)
- for (vector<SPGuideAttachment>::const_iterator i(guide.attached_items.begin()),
- iEnd(guide.attached_items.end());
+ for (vector<SPGuideAttachment>::const_iterator i(attached_items.begin()),
+ iEnd(attached_items.end());
i != iEnd; ++i)
{
SPGuideAttachment const &att = *i;
- sp_item_notify_moveto(*att.item, guide, att.snappoint_ix, position, commit);
+ sp_item_notify_moveto(*att.item, this, att.snappoint_ix, position, commit);
}
*/
}
-void sp_guide_set_color(SPGuide &guide, const unsigned r, const unsigned g, const unsigned b, bool const commit)
+void SPGuide::set_color(const unsigned r, const unsigned g, const unsigned b, bool const commit)
{
- g_assert(SP_IS_GUIDE(&guide));
- guide.color = (r << 24) | (g << 16) | (b << 8) | 0x7f;
+ this->color = (r << 24) | (g << 16) | (b << 8) | 0x7f;
- if (guide.views){
- sp_guideline_set_color(SP_GUIDELINE(guide.views->data), guide.color);
+ if (views) {
+ sp_guideline_set_color(SP_GUIDELINE(views->data), this->color);
}
- if (commit){
+ if (commit) {
std::ostringstream os;
os << "rgb(" << r << "," << g << "," << b << ")";
//XML Tree being used directly while it shouldn't be
- guide.getRepr()->setAttribute("inkscape:color", os.str().c_str());
+ getRepr()->setAttribute("inkscape:color", os.str().c_str());
}
}
-void sp_guide_set_label(SPGuide &guide, const char* label, bool const commit)
+void SPGuide::set_label(const char* label, bool const commit)
{
- g_assert(SP_IS_GUIDE(&guide));
- if (guide.views){
- sp_guideline_set_label(SP_GUIDELINE(guide.views->data), label);
+ if (views) {
+ sp_guideline_set_label(SP_GUIDELINE(views->data), label);
}
- if (commit){
+ if (commit) {
//XML Tree being used directly while it shouldn't be
- guide.getRepr()->setAttribute("inkscape:label", label);
+ getRepr()->setAttribute("inkscape:label", label);
}
}
@@ -464,33 +396,33 @@ void sp_guide_set_label(SPGuide &guide, const char* label, bool const commit)
*
* The caller is responsible for freeing the string.
*/
-char *sp_guide_description(SPGuide const *guide, const bool verbose)
+char* SPGuide::description(bool const verbose) const
{
using Geom::X;
using Geom::Y;
- char *descr = 0;
- if ( !guide->document ) {
+ char *descr = NULL;
+ if ( !this->document ) {
// Guide has probably been deleted and no longer has an attached namedview.
- descr = g_strdup_printf("%s", _("Deleted"));
+ descr = g_strdup(_("Deleted"));
} else {
- SPNamedView *namedview = sp_document_namedview(guide->document, NULL);
+ SPNamedView *namedview = sp_document_namedview(this->document, NULL);
- Inkscape::Util::Quantity x_q = Inkscape::Util::Quantity(guide->point_on_line[X], "px");
- Inkscape::Util::Quantity y_q = Inkscape::Util::Quantity(guide->point_on_line[Y], "px");
+ Inkscape::Util::Quantity x_q = Inkscape::Util::Quantity(this->point_on_line[X], "px");
+ Inkscape::Util::Quantity y_q = Inkscape::Util::Quantity(this->point_on_line[Y], "px");
GString *position_string_x = g_string_new(x_q.string(namedview->doc_units).c_str());
GString *position_string_y = g_string_new(y_q.string(namedview->doc_units).c_str());
gchar *shortcuts = g_strdup_printf("; %s", _("<b>Shift+drag</b> to rotate, <b>Ctrl+drag</b> to move origin, <b>Del</b> to delete"));
- if ( are_near(guide->normal_to_line, Geom::Point(1., 0.)) ||
- are_near(guide->normal_to_line, -Geom::Point(1., 0.)) ) {
+ if ( are_near(this->normal_to_line, Geom::Point(1., 0.)) ||
+ are_near(this->normal_to_line, -Geom::Point(1., 0.)) ) {
descr = g_strdup_printf(_("vertical, at %s"), position_string_x->str);
- } else if ( are_near(guide->normal_to_line, Geom::Point(0., 1.)) ||
- are_near(guide->normal_to_line, -Geom::Point(0., 1.)) ) {
+ } else if ( are_near(this->normal_to_line, Geom::Point(0., 1.)) ||
+ are_near(this->normal_to_line, -Geom::Point(0., 1.)) ) {
descr = g_strdup_printf(_("horizontal, at %s"), position_string_y->str);
} else {
- double const radians = guide->angle();
+ double const radians = this->angle();
double const degrees = Geom::rad_to_deg(radians);
int const degrees_int = (int) round(degrees);
descr = g_strdup_printf(_("at %d degrees, through (%s,%s)"),
@@ -537,4 +469,4 @@ void sp_guide_remove(SPGuide *guide)
fill-column:99
End:
*/
-// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4 :
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :
diff --git a/src/sp-guide.h b/src/sp-guide.h
index fa4f0033b..382ea56f0 100644
--- a/src/sp-guide.h
+++ b/src/sp-guide.h
@@ -13,15 +13,21 @@
*
*/
+#include <2geom/point.h>
#include <vector>
-#include <2geom/point.h>
#include "sp-object.h"
#include "sp-guide-attachment.h"
+typedef unsigned int guint32;
+extern "C" {
+ typedef void (*GCallback) (void);
+ typedef struct _GSList GSList;
+}
+
+class SPDesktop;
struct SPCanvas;
struct SPCanvasGroup;
-class SPDesktop;
#define SP_GUIDE(obj) (dynamic_cast<SPGuide*>((SPObject*)obj))
#define SP_IS_GUIDE(obj) (dynamic_cast<const SPGuide*>((SPObject*)obj) != NULL)
@@ -29,51 +35,65 @@ class SPDesktop;
/* Represents the constraint on p that dot(g.direction, p) == g.position. */
class SPGuide : public SPObject {
public:
- SPGuide();
- virtual ~SPGuide();
+ SPGuide();
+ virtual ~SPGuide() {}
- char* label;
- Geom::Point normal_to_line;
- Geom::Point point_on_line;
+ void set_color(const unsigned r, const unsigned g, const unsigned b, bool const commit);
+ void setColor(guint32 c);
+ void setHiColor(guint32 h) { hicolor = h; }
- guint32 color;
- guint32 hicolor;
- GSList *views;
- std::vector<SPGuideAttachment> attached_items;
+ guint32 getColor() const { return color; }
+ guint32 getHiColor() const { return hicolor; }
+ Geom::Point getPoint() const { return point_on_line; }
+ Geom::Point getNormal() const { return normal_to_line; }
- guint32 getColor() const;
- guint32 getHiColor() const;
- void setColor(guint32 c);
- void setHiColor(guint32 h);
+ void moveto(Geom::Point const point_on_line, bool const commit);
+ void set_normal(Geom::Point const normal_to_line, bool const commit);
+
+ void set_label(const char* label, bool const commit);
+ char const* getLabel() const { return label; }
- inline bool isHorizontal() const { return (normal_to_line[Geom::X] == 0.); };
- inline bool isVertical() const { return (normal_to_line[Geom::Y] == 0.); };
- inline double angle() const { return std::atan2( - normal_to_line[Geom::X], normal_to_line[Geom::Y] ); };
static SPGuide *createSPGuide(SPDocument *doc, Geom::Point const &pt1, Geom::Point const &pt2);
+
void showSPGuide(SPCanvasGroup *group, GCallback handler);
void hideSPGuide(SPCanvas *canvas);
- void sensitize(SPCanvas *canvas, gboolean sensitive);
- Geom::Point getPositionFrom(Geom::Point const &pt) const;
+ void showSPGuide(); // argument-free versions
+ void hideSPGuide();
+
+ void sensitize(SPCanvas *canvas, bool sensitive);
+
+ bool isHorizontal() const { return (normal_to_line[Geom::X] == 0.); };
+ bool isVertical() const { return (normal_to_line[Geom::Y] == 0.); };
+
+ char* description(bool const verbose = true) const;
+
+ double angle() const { return std::atan2( - normal_to_line[Geom::X], normal_to_line[Geom::Y] ); }
double getDistanceFrom(Geom::Point const &pt) const;
+ Geom::Point getPositionFrom(Geom::Point const &pt) const;
protected:
- virtual void build(SPDocument* doc, Inkscape::XML::Node* repr);
- virtual void release();
- virtual void set(unsigned int key, const gchar* value);
+ virtual void build(SPDocument* doc, Inkscape::XML::Node* repr);
+ virtual void release();
+ virtual void set(unsigned int key, const char* value);
+
+ char* label;
+ GSList *views; // contains an object of type SPGuideline (see display/guideline.cpp for definition)
+ Geom::Point normal_to_line;
+ Geom::Point point_on_line;
+
+ guint32 color;
+ guint32 hicolor;
+public:
+ std::vector<SPGuideAttachment> attached_items; // unused
};
+// These functions rightfully belong to SPDesktop. What gives?!
void sp_guide_pt_pairs_to_guides(SPDocument *doc, std::list<std::pair<Geom::Point, Geom::Point> > &pts);
void sp_guide_create_guides_around_page(SPDesktop *dt);
void sp_guide_delete_all_guides(SPDesktop *dt);
-void sp_guide_moveto(SPGuide &guide, Geom::Point const point_on_line, bool const commit);
-void sp_guide_set_normal(SPGuide &guide, Geom::Point const normal_to_line, bool const commit);
-void sp_guide_set_label(SPGuide &guide, const char* label, bool const commit);
-void sp_guide_set_color(SPGuide &guide, const unsigned r, const unsigned g, const unsigned b, bool const commit);
void sp_guide_remove(SPGuide *guide);
-char *sp_guide_description(SPGuide const *guide, const bool verbose = true);
-
#endif // SEEN_SP_GUIDE_H
/*
diff --git a/src/sp-image.cpp b/src/sp-image.cpp
index cb8ede2b2..b6177fae6 100644
--- a/src/sp-image.cpp
+++ b/src/sp-image.cpp
@@ -20,6 +20,7 @@
#include <cstring>
#include <algorithm>
#include <string>
+#include <glibmm.h>
#include <glib/gstdio.h>
#include <2geom/rect.h>
#include <2geom/transforms.h>
diff --git a/src/sp-image.h b/src/sp-image.h
index 17262d74f..9fa33b5de 100644
--- a/src/sp-image.h
+++ b/src/sp-image.h
@@ -14,7 +14,6 @@
#ifndef SEEN_INKSCAPE_SP_IMAGE_H
#define SEEN_INKSCAPE_SP_IMAGE_H
-#include <gdk-pixbuf/gdk-pixbuf.h>
#include <glibmm/ustring.h>
#include "svg/svg-length.h"
#include "display/curve.h"
@@ -43,24 +42,24 @@ public:
SPCurve *curve; // This curve is at the image's boundary for snapping
- gchar *href;
+ char *href;
#if defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2)
- gchar *color_profile;
+ char *color_profile;
#endif // defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2)
Inkscape::Pixbuf *pixbuf;
virtual void build(SPDocument *document, Inkscape::XML::Node *repr);
virtual void release();
- virtual void set(unsigned int key, gchar const* value);
- virtual void update(SPCtx *ctx, guint flags);
- virtual Inkscape::XML::Node* write(Inkscape::XML::Document *xml_doc, Inkscape::XML::Node *repr, guint flags);
+ virtual void set(unsigned int key, char const* value);
+ virtual void update(SPCtx *ctx, unsigned int flags);
+ virtual Inkscape::XML::Node* write(Inkscape::XML::Document *xml_doc, Inkscape::XML::Node *repr, unsigned int flags);
virtual void modified(unsigned int flags);
virtual Geom::OptRect bbox(Geom::Affine const &transform, SPItem::BBoxType type) const;
virtual void print(SPPrintContext *ctx);
virtual const char* displayName() const;
- virtual gchar* description() const;
+ virtual char* description() const;
virtual Inkscape::DrawingItem* show(Inkscape::Drawing &drawing, unsigned int key, unsigned int flags);
virtual void snappoints(std::vector<Inkscape::SnapCandidatePoint> &p, Inkscape::SnapPreferences const *snapprefs) const;
virtual Geom::Affine set_transform(Geom::Affine const &transform);
diff --git a/src/sp-item-group.cpp b/src/sp-item-group.cpp
index 02359baa3..613ace5c1 100644
--- a/src/sp-item-group.cpp
+++ b/src/sp-item-group.cpp
@@ -614,6 +614,18 @@ SPGroup::LayerMode SPGroup::layerDisplayMode(unsigned int dkey) const {
}
}
+void SPGroup::setExpanded(bool isexpanded) {
+ if ( _expanded != isexpanded ){
+ _expanded = isexpanded;
+ }
+}
+
+void SPGroup::setInsertBottom(bool insertbottom) {
+ if ( _insertBottom != insertbottom) {
+ _insertBottom = insertbottom;
+ }
+}
+
void SPGroup::setLayerDisplayMode(unsigned int dkey, SPGroup::LayerMode mode) {
if ( layerDisplayMode(dkey) != mode ) {
_display_modes[dkey] = mode;
diff --git a/src/sp-item-group.h b/src/sp-item-group.h
index dd1e9317a..15bb58f22 100644
--- a/src/sp-item-group.h
+++ b/src/sp-item-group.h
@@ -1,5 +1,5 @@
-#ifndef __SP_ITEM_GROUP_H__
-#define __SP_ITEM_GROUP_H__
+#ifndef SEEN_SP_ITEM_GROUP_H
+#define SEEN_SP_ITEM_GROUP_H
/*
* SVG <g> implementation
@@ -25,6 +25,7 @@ namespace Inkscape {
class Drawing;
class DrawingItem;
+typedef struct _GSList GSList;
} // namespace Inkscape
@@ -35,12 +36,20 @@ public:
enum LayerMode { GROUP, LAYER, MASK_HELPER };
+ bool _expanded;
+ bool _insertBottom;
LayerMode _layer_mode;
std::map<unsigned int, LayerMode> _display_modes;
LayerMode layerMode() const { return _layer_mode; }
void setLayerMode(LayerMode mode);
+ bool expanded() const { return _expanded; }
+ void setExpanded(bool isexpanded);
+
+ bool insertBottom() const { return _insertBottom; }
+ void setInsertBottom(bool insertbottom);
+
LayerMode effectiveLayerMode(unsigned int display_key) const {
if ( _layer_mode == LAYER ) {
return LAYER;
@@ -54,7 +63,7 @@ public:
void translateChildItems(Geom::Translate const &tr);
void scaleChildItemsRec(Geom::Scale const &sc, Geom::Point const &p, bool noRecurse);
- gint getItemCount() const;
+ int getItemCount() const;
virtual void _showChildren (Inkscape::Drawing &drawing, Inkscape::DrawingItem *ai, unsigned int key, unsigned int flags);
private:
@@ -69,15 +78,15 @@ public:
virtual void order_changed(Inkscape::XML::Node *child, Inkscape::XML::Node *old_ref, Inkscape::XML::Node *new_ref);
virtual void update(SPCtx *ctx, unsigned int flags);
- virtual void modified(guint flags);
- virtual void set(unsigned int key, gchar const* value);
+ virtual void modified(unsigned int flags);
+ virtual void set(unsigned int key, char const* value);
- virtual Inkscape::XML::Node* write(Inkscape::XML::Document *xml_doc, Inkscape::XML::Node *repr, guint flags);
+ virtual Inkscape::XML::Node* write(Inkscape::XML::Document *xml_doc, Inkscape::XML::Node *repr, unsigned int flags);
virtual Geom::OptRect bbox(Geom::Affine const &transform, SPItem::BBoxType bboxtype) const;
virtual void print(SPPrintContext *ctx);
virtual const char* displayName() const;
- virtual gchar *description() const;
+ virtual char *description() const;
virtual Inkscape::DrawingItem *show (Inkscape::Drawing &drawing, unsigned int key, unsigned int flags);
virtual void hide (unsigned int key);
@@ -90,7 +99,7 @@ void sp_item_group_ungroup (SPGroup *group, GSList **children, bool do_done = tr
GSList *sp_item_group_item_list (SPGroup *group);
-SPObject *sp_item_group_get_child_by_name (SPGroup *group, SPObject *ref, const gchar *name);
+SPObject *sp_item_group_get_child_by_name (SPGroup *group, SPObject *ref, const char *name);
#endif
diff --git a/src/sp-item-notify-moveto.cpp b/src/sp-item-notify-moveto.cpp
index 0f5117289..dcc91fd0b 100644
--- a/src/sp-item-notify-moveto.cpp
+++ b/src/sp-item-notify-moveto.cpp
@@ -9,6 +9,7 @@
#include <sp-item-notify-moveto.h>
using std::vector;
+#define return_if_fail(test) if (!(test)) { printf("WARNING: assertion '%s' failed", #test); return; }
/**
* Called by sp_guide_moveto to indicate that the guide line corresponding to g has been moved, and
@@ -19,15 +20,15 @@ using std::vector;
void sp_item_notify_moveto(SPItem &item, SPGuide const &mv_g, int const snappoint_ix,
double const position, bool const commit)
{
- g_return_if_fail(SP_IS_ITEM(&item));
- g_return_if_fail( unsigned(snappoint_ix) < 8 );
- Geom::Point const dir( mv_g.normal_to_line );
+ return_if_fail(SP_IS_ITEM(&item));
+ return_if_fail( unsigned(snappoint_ix) < 8 );
+ Geom::Point const dir( mv_g.getNormal() );
double const dir_lensq(dot(dir, dir));
- g_return_if_fail( dir_lensq != 0 );
+ return_if_fail( dir_lensq != 0 );
std::vector<Inkscape::SnapCandidatePoint> snappoints;
item.getSnappoints(snappoints, NULL);
- g_return_if_fail( snappoint_ix < int(snappoints.size()) );
+ return_if_fail( snappoint_ix < int(snappoints.size()) );
double const pos0 = dot(dir, snappoints[snappoint_ix].getPoint());
/// \todo effic: skip if mv_g is already satisfied.
diff --git a/src/sp-item-transform.cpp b/src/sp-item-transform.cpp
index 086da56ff..86beee907 100644
--- a/src/sp-item-transform.cpp
+++ b/src/sp-item-transform.cpp
@@ -18,6 +18,8 @@
#include "sp-item.h"
#include "sp-item-transform.h"
+#include <glib.h>
+
void sp_item_rotate_rel(SPItem *item, Geom::Rotate const &rotation)
{
Geom::Point center = item->getCenter();
diff --git a/src/sp-item-transform.h b/src/sp-item-transform.h
index 230d5a3dd..d563c9768 100644
--- a/src/sp-item-transform.h
+++ b/src/sp-item-transform.h
@@ -1,9 +1,8 @@
#ifndef SEEN_SP_ITEM_TRANSFORM_H
#define SEEN_SP_ITEM_TRANSFORM_H
-#include <glib.h>
-
#include <2geom/forward.h>
+
class SPItem;
void sp_item_rotate_rel(SPItem *item, Geom::Rotate const &rotation);
@@ -11,9 +10,9 @@ void sp_item_scale_rel (SPItem *item, Geom::Scale const &scale);
void sp_item_skew_rel (SPItem *item, double skewX, double skewY);
void sp_item_move_rel(SPItem *item, Geom::Translate const &tr);
-Geom::Affine get_scale_transform_for_uniform_stroke (Geom::Rect const &bbox_visual, gdouble stroke_x, gdouble stroke_y, bool transform_stroke, bool preserve, gdouble x0, gdouble y0, gdouble x1, gdouble y1);
-Geom::Affine get_scale_transform_for_variable_stroke (Geom::Rect const &bbox_visual, Geom::Rect const &bbox_geom, bool transform_stroke, bool preserve, gdouble x0, gdouble y0, gdouble x1, gdouble y1);
-Geom::Rect get_visual_bbox (Geom::OptRect const &initial_geom_bbox, Geom::Affine const &abs_affine, gdouble const initial_strokewidth, bool const transform_stroke);
+Geom::Affine get_scale_transform_for_uniform_stroke (Geom::Rect const &bbox_visual, double stroke_x, double stroke_y, bool transform_stroke, bool preserve, double x0, double y0, double x1, double y1);
+Geom::Affine get_scale_transform_for_variable_stroke (Geom::Rect const &bbox_visual, Geom::Rect const &bbox_geom, bool transform_stroke, bool preserve, double x0, double y0, double x1, double y1);
+Geom::Rect get_visual_bbox (Geom::OptRect const &initial_geom_bbox, Geom::Affine const &abs_affine, double const initial_strokewidth, bool const transform_stroke);
#endif // SEEN_SP_ITEM_TRANSFORM_H
diff --git a/src/sp-item.cpp b/src/sp-item.cpp
index 52ee6b7d8..967756055 100644
--- a/src/sp-item.cpp
+++ b/src/sp-item.cpp
@@ -100,6 +100,8 @@ SPItem::SPItem() : SPObject() {
sensitive = TRUE;
bbox_valid = FALSE;
+ _highlightColor = NULL;
+
transform_center_x = 0;
transform_center_y = 0;
@@ -183,6 +185,26 @@ bool SPItem::isHidden(unsigned display_key) const {
return true;
}
+bool SPItem::isHighlightSet() const {
+ return _highlightColor != NULL;
+}
+
+guint32 SPItem::highlight_color() const {
+ if (_highlightColor)
+ {
+ return atoi(_highlightColor) | 0x00000000;
+ }
+ else if (parent && parent != this && SP_IS_ITEM(parent))
+ {
+ return SP_ITEM(parent)->highlight_color();
+ }
+ else
+ {
+ static Inkscape::Preferences *prefs = Inkscape::Preferences::get();
+ return prefs->getInt("/tools/nodes/highlight_color", 0xff0000ff) | 0x00000000;
+ }
+}
+
void SPItem::setEvaluated(bool evaluated) {
_is_evaluated = evaluated;
_evaluated_status = StatusSet;
@@ -372,7 +394,7 @@ void SPItem::lowerToBottom() {
* \param target - the SPItem to move into or after
* \param intoafter - move to after the target (false), move inside (sublayer) of the target (true)
*/
-void SPItem::moveTo(SPItem *target, gboolean intoafter) {
+void SPItem::moveTo(SPItem *target, bool intoafter) {
Inkscape::XML::Node *target_ref = ( target ? target->getRepr() : NULL );
Inkscape::XML::Node *our_ref = getRepr();
@@ -425,6 +447,7 @@ void SPItem::build(SPDocument *document, Inkscape::XML::Node *repr) {
object->readAttr( "inkscape:transform-center-y" );
object->readAttr( "inkscape:connector-avoid" );
object->readAttr( "inkscape:connection-points" );
+ object->readAttr( "inkscape:highlight-color" );
SPObject::build(document, repr);
}
@@ -507,11 +530,23 @@ void SPItem::set(unsigned int key, gchar const* value) {
break;
}
case SP_ATTR_SODIPODI_INSENSITIVE:
+ {
item->sensitive = !value;
for (SPItemView *v = item->display; v != NULL; v = v->next) {
v->arenaitem->setSensitive(item->sensitive);
}
break;
+ }
+ case SP_ATTR_INKSCAPE_HIGHLIGHT_COLOR:
+ {
+ g_free(item->_highlightColor);
+ if (value) {
+ item->_highlightColor = g_strdup(value);
+ } else {
+ item->_highlightColor = NULL;
+ }
+ break;
+ }
case SP_ATTR_CONNECTOR_AVOID:
item->avoidRef->setAvoid(value);
break;
@@ -775,6 +810,11 @@ Inkscape::XML::Node* SPItem::write(Inkscape::XML::Document *xml_doc, Inkscape::X
g_free ((void *) uri);
}
}
+ if (item->_highlightColor){
+ repr->setAttribute("inkscape:highlight-color", item->_highlightColor);
+ } else {
+ repr->setAttribute("inkscape:highlight-color", NULL);
+ }
SPObject::write(xml_doc, repr, flags);
diff --git a/src/sp-item.h b/src/sp-item.h
index 98aed0fd6..1656a0c2b 100644
--- a/src/sp-item.h
+++ b/src/sp-item.h
@@ -18,10 +18,11 @@
*
* Released under GNU GPL, read the file 'COPYING' for more information
*/
-#include <vector>
+
#include <2geom/forward.h>
#include <2geom/affine.h>
#include <2geom/rect.h>
+#include <vector>
#include "sp-object.h"
#include "snap-preferences.h"
@@ -35,6 +36,7 @@ class SPMaskReference;
class SPAvoidRef;
class SPPattern;
struct SPPrintContext;
+typedef unsigned int guint32;
namespace Inkscape {
@@ -73,7 +75,7 @@ enum PatternTransform {
class SPEvent {
public:
unsigned int type;
- gpointer data;
+ void* data;
};
/// SPItemView
@@ -154,6 +156,19 @@ public:
bool isHidden() const;
void setHidden(bool hidden);
+ /* Objects dialogue */
+ bool isSensitive() const {
+ return sensitive;
+ };
+
+ bool isHighlightSet() const;
+ guint32 highlight_color() const;
+
+ void setHighlightColor(guint32 color);
+
+ void unsetHighlightColor();
+ /********************/
+
bool isEvaluated() const;
void setEvaluated(bool visible);
void resetEvaluated();
@@ -180,7 +195,7 @@ public:
void lowerOne();
void raiseToTop();
void lowerToBottom();
- void moveTo(SPItem *target, gboolean intoafter);
+ void moveTo(SPItem *target, bool intoafter);
sigc::connection connectTransformed(sigc::slot<void, Geom::Affine const *, SPItem *> slot) {
return _transformed_signal.connect(slot);
@@ -199,7 +214,7 @@ public:
unsigned int pos_in_parent() const;
- gchar *detailedDescription() const;
+ char *detailedDescription() const;
bool isFiltered() const;
@@ -210,14 +225,14 @@ public:
void getSnappoints(std::vector<Inkscape::SnapCandidatePoint> &p, Inkscape::SnapPreferences const *snapprefs=0) const;
void adjust_pattern(/* Geom::Affine const &premul, */ Geom::Affine const &postmul, bool set = false, PatternTransform = TRANSFORM_BOTH);
void adjust_gradient(/* Geom::Affine const &premul, */ Geom::Affine const &postmul, bool set = false);
- void adjust_stroke(gdouble ex);
- void adjust_stroke_width_recursive(gdouble ex);
+ void adjust_stroke(double ex);
+ void adjust_stroke_width_recursive(double ex);
void freeze_stroke_width_recursive(bool freeze);
void adjust_paint_recursive(Geom::Affine advertized_transform, Geom::Affine t_ancestors, bool is_pattern);
void adjust_livepatheffect(Geom::Affine const &postmul, bool set = false);
void doWriteTransform(Inkscape::XML::Node *repr, Geom::Affine const &transform, Geom::Affine const *adv = NULL, bool compensate = true);
void set_item_transform(Geom::Affine const &transform_matrix);
- gint emitEvent (SPEvent &event);
+ int emitEvent (SPEvent &event);
Inkscape::DrawingItem *get_arenaitem(unsigned int key);
Geom::Affine i2doc_affine() const;
@@ -225,6 +240,7 @@ public:
void set_i2d_affine(Geom::Affine const &transform);
Geom::Affine dt2i_affine() const;
+ char *_highlightColor;
private:
enum EvaluatedStatus
{
@@ -243,15 +259,15 @@ private:
public:
virtual void build(SPDocument *document, Inkscape::XML::Node *repr);
virtual void release();
- virtual void set(unsigned int key, gchar const* value);
- virtual void update(SPCtx *ctx, guint flags);
- virtual void modified(unsigned int flags);
- virtual Inkscape::XML::Node* write(Inkscape::XML::Document *xml_doc, Inkscape::XML::Node *repr, guint flags);
+ virtual void set(unsigned int key, char const* value);
+ virtual void update(SPCtx *ctx, unsigned int flags);
+ virtual void modified(unsigned int flags);
+ virtual Inkscape::XML::Node* write(Inkscape::XML::Document *xml_doc, Inkscape::XML::Node *repr, unsigned int flags);
virtual Geom::OptRect bbox(Geom::Affine const &transform, SPItem::BBoxType type) const;
virtual void print(SPPrintContext *ctx);
virtual const char* displayName() const;
- virtual gchar* description() const;
+ virtual char* description() const;
virtual Inkscape::DrawingItem* show(Inkscape::Drawing &drawing, unsigned int key, unsigned int flags);
virtual void hide(unsigned int key);
virtual void snappoints(std::vector<Inkscape::SnapCandidatePoint> &p, Inkscape::SnapPreferences const *snapprefs) const;
@@ -259,7 +275,7 @@ public:
virtual void convert_to_guides() const;
- virtual gint event(SPEvent *event);
+ virtual int event(SPEvent *event);
};
diff --git a/src/sp-line.h b/src/sp-line.h
index c1932d3ee..d6a075659 100644
--- a/src/sp-line.h
+++ b/src/sp-line.h
@@ -31,13 +31,13 @@ public:
SVGLength y2;
virtual void build(SPDocument *document, Inkscape::XML::Node *repr);
- virtual Inkscape::XML::Node* write(Inkscape::XML::Document *xml_doc, Inkscape::XML::Node *repr, guint flags);
- virtual void set(unsigned int key, gchar const* value);
+ virtual Inkscape::XML::Node* write(Inkscape::XML::Document *xml_doc, Inkscape::XML::Node *repr, unsigned int flags);
+ virtual void set(unsigned int key, char const* value);
virtual const char* displayName() const;
virtual Geom::Affine set_transform(Geom::Affine const &transform);
virtual void convert_to_guides() const;
- virtual void update(SPCtx* ctx, guint flags);
+ virtual void update(SPCtx* ctx, unsigned int flags);
virtual void set_shape();
};
diff --git a/src/sp-linear-gradient.cpp b/src/sp-linear-gradient.cpp
index 959e8d733..6e9f5e6dd 100644
--- a/src/sp-linear-gradient.cpp
+++ b/src/sp-linear-gradient.cpp
@@ -1,3 +1,5 @@
+#include <cairo.h>
+
#include "sp-linear-gradient.h"
#include "attributes.h"
diff --git a/src/sp-linear-gradient.h b/src/sp-linear-gradient.h
index ac3fdb04a..a152e7fe2 100644
--- a/src/sp-linear-gradient.h
+++ b/src/sp-linear-gradient.h
@@ -26,8 +26,8 @@ public:
protected:
virtual void build(SPDocument *document, Inkscape::XML::Node *repr);
- virtual void set(unsigned key, gchar const *value);
- virtual Inkscape::XML::Node* write(Inkscape::XML::Document *xml_doc, Inkscape::XML::Node *repr, guint flags);
+ virtual void set(unsigned key, char const *value);
+ virtual Inkscape::XML::Node* write(Inkscape::XML::Document *xml_doc, Inkscape::XML::Node *repr, unsigned int flags);
};
#endif /* !SP_LINEAR_GRADIENT_H */
diff --git a/src/sp-lpe-item.cpp b/src/sp-lpe-item.cpp
index 17cacbae2..019d15162 100644
--- a/src/sp-lpe-item.cpp
+++ b/src/sp-lpe-item.cpp
@@ -36,14 +36,14 @@
#include "message-stack.h"
#include "inkscape.h"
#include "desktop.h"
-#include "shape-editor.h"
+#include "ui/shape-editor.h"
#include "sp-ellipse.h"
#include "display/curve.h"
#include "svg/svg.h"
#include <2geom/pathvector.h>
#include "sp-clippath.h"
#include "sp-mask.h"
-#include "tools-switch.h"
+#include "ui/tools-switch.h"
#include "ui/tools/node-tool.h"
#include "ui/tools/tool-base.h"
@@ -56,7 +56,6 @@ static void lpeobject_ref_modified(SPObject *href, guint flags, SPLPEItem *lpeit
static void sp_lpe_item_create_original_path_recursive(SPLPEItem *lpeitem);
static void sp_lpe_item_cleanup_original_path_recursive(SPLPEItem *lpeitem);
-static void sp_lpe_item_apply_to_clip_or_mask_group(SPGroup * group, SPItem * item);
typedef std::list<std::string> HRefList;
static std::string patheffectlist_write_svg(PathEffectList const & list);
@@ -249,7 +248,7 @@ bool SPLPEItem::performPathEffect(SPCurve *curve) {
// Groups have their doBeforeEffect called elsewhere
if (!SP_IS_GROUP(this)) {
- lpe->doBeforeEffect(this);
+ lpe->doBeforeEffect_impl(this);
}
try {
@@ -263,6 +262,9 @@ bool SPLPEItem::performPathEffect(SPCurve *curve) {
}
return false;
}
+ if (!SP_IS_GROUP(this)) {
+ lpe->doAfterEffect(this);
+ }
}
}
}
@@ -341,6 +343,16 @@ sp_lpe_item_create_original_path_recursive(SPLPEItem *lpeitem)
{
g_return_if_fail(lpeitem != NULL);
+ SPMask * mask = lpeitem->mask_ref->getObject();
+ if(mask)
+ {
+ sp_lpe_item_create_original_path_recursive(SP_LPE_ITEM(mask->firstChild()));
+ }
+ SPClipPath * clipPath = lpeitem->clip_ref->getObject();
+ if(clipPath)
+ {
+ sp_lpe_item_create_original_path_recursive(SP_LPE_ITEM(clipPath->firstChild()));
+ }
if (SP_IS_GROUP(lpeitem)) {
GSList const *item_list = sp_item_group_item_list(SP_GROUP(lpeitem));
for ( GSList const *iter = item_list; iter; iter = iter->next ) {
@@ -364,6 +376,18 @@ sp_lpe_item_cleanup_original_path_recursive(SPLPEItem *lpeitem)
g_return_if_fail(lpeitem != NULL);
if (SP_IS_GROUP(lpeitem)) {
+ if (!lpeitem->hasPathEffectRecursive()) {
+ SPMask * mask = lpeitem->mask_ref->getObject();
+ if(mask)
+ {
+ sp_lpe_item_cleanup_original_path_recursive(SP_LPE_ITEM(mask->firstChild()));
+ }
+ SPClipPath * clipPath = lpeitem->clip_ref->getObject();
+ if(clipPath)
+ {
+ sp_lpe_item_cleanup_original_path_recursive(SP_LPE_ITEM(clipPath->firstChild()));
+ }
+ }
GSList const *item_list = sp_item_group_item_list(SP_GROUP(lpeitem));
for ( GSList const *iter = item_list; iter; iter = iter->next ) {
SPObject *subitem = static_cast<SPObject *>(iter->data);
@@ -375,6 +399,16 @@ sp_lpe_item_cleanup_original_path_recursive(SPLPEItem *lpeitem)
else if (SP_IS_PATH(lpeitem)) {
Inkscape::XML::Node *repr = lpeitem->getRepr();
if (!lpeitem->hasPathEffectRecursive() && repr->attribute("inkscape:original-d")) {
+ SPMask * mask = lpeitem->mask_ref->getObject();
+ if(mask)
+ {
+ sp_lpe_item_cleanup_original_path_recursive(SP_LPE_ITEM(mask->firstChild()));
+ }
+ SPClipPath * clipPath = lpeitem->clip_ref->getObject();
+ if(clipPath)
+ {
+ sp_lpe_item_cleanup_original_path_recursive(SP_LPE_ITEM(clipPath->firstChild()));
+ }
repr->setAttribute("d", repr->attribute("inkscape:original-d"));
repr->setAttribute("inkscape:original-d", NULL);
}
@@ -462,10 +496,13 @@ void SPLPEItem::removeCurrentPathEffect(bool keep_paths)
if (!lperef)
return;
+ if (Inkscape::LivePathEffect::Effect* effect_ = this->getCurrentLPE()) {
+ effect_->doOnRemove(this);
+ }
PathEffectList new_list = *this->path_effect_list;
new_list.remove(lperef); //current lpe ref is always our 'own' pointer from the path_effect_list
std::string r = patheffectlist_write_svg(new_list);
-
+
if (!r.empty()) {
this->getRepr()->setAttribute("inkscape:path-effect", r.c_str());
} else {
@@ -607,12 +644,8 @@ bool SPLPEItem::hasPathEffectRecursive() const
return hasPathEffect();
}
}
-
-//The next 3 functions are because the revert of the bug 1241902
-//for the moment not used
-
void
-sp_lpe_item_apply_to_clippath(SPItem * item)
+SPLPEItem::apply_to_clippath(SPItem *item)
{
SPClipPath *clipPath = item->clip_ref->getObject();
if(clipPath) {
@@ -624,11 +657,18 @@ sp_lpe_item_apply_to_clippath(SPItem * item)
} else if(SP_IS_SHAPE(clip_data)) {
clip_curve = SP_SHAPE(clip_data)->getCurve();
} else if(SP_IS_GROUP(clip_data)) {
- sp_lpe_item_apply_to_clip_or_mask_group(SP_GROUP(clip_data), item);
+ apply_to_clip_or_mask_group(SP_ITEM(clip_data), item);
return;
}
if(clip_curve) {
- bool success = SP_LPE_ITEM(item)->performPathEffect(clip_curve);
+ bool success = false;
+ if(SP_IS_GROUP(this)){
+ clip_curve->transform(i2anc_affine(SP_GROUP(item), SP_GROUP(this)));
+ success = this->performPathEffect(clip_curve);
+ clip_curve->transform(i2anc_affine(SP_GROUP(item), SP_GROUP(this)).inverse());
+ } else {
+ success = this->performPathEffect(clip_curve);
+ }
Inkscape::XML::Node *reprClip = clip_data->getRepr();
if (success) {
gchar *str = sp_svg_write_path(clip_curve->get_pathvector());
@@ -648,10 +688,17 @@ sp_lpe_item_apply_to_clippath(SPItem * item)
clip_curve->unref();
}
}
+ if(SP_IS_GROUP(item)){
+ GSList const *item_list = sp_item_group_item_list(SP_GROUP(item));
+ for ( GSList const *iter = item_list; iter; iter = iter->next ) {
+ SPObject *subitem = static_cast<SPObject *>(iter->data);
+ apply_to_clippath(SP_ITEM(subitem));
+ }
+ }
}
void
-sp_lpe_item_apply_to_mask(SPItem * item)
+SPLPEItem::apply_to_mask(SPItem *item)
{
SPMask *mask = item->mask_ref->getObject();
if(mask) {
@@ -662,11 +709,18 @@ sp_lpe_item_apply_to_mask(SPItem * item)
} else if(SP_IS_SHAPE(mask_data)) {
mask_curve = SP_SHAPE(mask_data)->getCurve();
} else if(SP_IS_GROUP(mask_data)) {
- sp_lpe_item_apply_to_clip_or_mask_group(SP_GROUP(mask_data), item);
+ apply_to_clip_or_mask_group(SP_ITEM(mask_data), item);
return;
}
if(mask_curve) {
- bool success = SP_LPE_ITEM(item)->performPathEffect(mask_curve);
+ bool success = false;
+ if(SP_IS_GROUP(this)){
+ mask_curve->transform(i2anc_affine(SP_GROUP(item), SP_GROUP(this)));
+ success = this->performPathEffect(mask_curve);
+ mask_curve->transform(i2anc_affine(SP_GROUP(item), SP_GROUP(this)).inverse());
+ } else {
+ success = this->performPathEffect(mask_curve);
+ }
Inkscape::XML::Node *reprmask = mask_data->getRepr();
if (success) {
gchar *str = sp_svg_write_path(mask_curve->get_pathvector());
@@ -686,16 +740,26 @@ sp_lpe_item_apply_to_mask(SPItem * item)
mask_curve->unref();
}
}
+ if(SP_IS_GROUP(item)){
+ GSList const *item_list = sp_item_group_item_list(SP_GROUP(item));
+ for ( GSList const *iter = item_list; iter; iter = iter->next ) {
+ SPObject *subitem = static_cast<SPObject *>(iter->data);
+ apply_to_mask(SP_ITEM(subitem));
+ }
+ }
}
-static void
-sp_lpe_item_apply_to_clip_or_mask_group(SPGroup *group, SPItem *item)
+void
+SPLPEItem::apply_to_clip_or_mask_group(SPItem *group, SPItem *item)
{
- GSList *item_list = sp_item_group_item_list(group);
+ if (!SP_IS_GROUP(group)) {
+ return;
+ }
+ GSList *item_list = sp_item_group_item_list(SP_GROUP(group));
for ( GSList *iter = item_list; iter; iter = iter->next ) {
SPObject *subitem = static_cast<SPObject *>(iter->data);
if (SP_IS_GROUP(subitem)) {
- sp_lpe_item_apply_to_clip_or_mask_group(SP_GROUP(subitem), item);
+ apply_to_clip_or_mask_group(SP_ITEM(subitem), item);
} else if (SP_IS_SHAPE(subitem)) {
SPCurve * c = NULL;
@@ -705,7 +769,14 @@ sp_lpe_item_apply_to_clip_or_mask_group(SPGroup *group, SPItem *item)
c = SP_SHAPE(subitem)->getCurve();
}
if (c) {
- bool success = SP_LPE_ITEM(item)->performPathEffect(c);
+ bool success = false;
+ if(SP_IS_GROUP(group)){
+ c->transform(i2anc_affine(SP_GROUP(item), SP_GROUP(this)));
+ success = this->performPathEffect(c);
+ c->transform(i2anc_affine(SP_GROUP(item), SP_GROUP(this)).inverse());
+ } else {
+ success = this->performPathEffect(c);
+ }
Inkscape::XML::Node *repr = subitem->getRepr();
if (success) {
gchar *str = sp_svg_write_path(c->get_pathvector());
@@ -744,6 +815,22 @@ SPLPEItem::getPathEffectOfType(int type)
return NULL;
}
+Inkscape::LivePathEffect::Effect const*
+SPLPEItem::getPathEffectOfType(int type) const
+{
+ std::list<Inkscape::LivePathEffect::LPEObjectReference *>::const_iterator i;
+ for (i = path_effect_list->begin(); i != path_effect_list->end(); ++i) {
+ LivePathEffectObject const *lpeobj = (*i)->lpeobject;
+ if (lpeobj) {
+ Inkscape::LivePathEffect::Effect const *lpe = lpeobj->get_lpe();
+ if (lpe && (lpe->effectType() == type)) {
+ return lpe;
+ }
+ }
+ }
+ return NULL;
+}
+
void SPLPEItem::editNextParamOncanvas(SPDesktop *dt)
{
Inkscape::LivePathEffect::LPEObjectReference *lperef = this->getCurrentLPEReference();
diff --git a/src/sp-lpe-item.h b/src/sp-lpe-item.h
index 5a38fdd0b..9c052b7b1 100644
--- a/src/sp-lpe-item.h
+++ b/src/sp-lpe-item.h
@@ -14,14 +14,12 @@
* Released under GNU GPL, read the file 'COPYING' for more information
*/
-#include "sp-item.h"
-
#include <list>
+#include "sp-item.h"
#define SP_LPE_ITEM(obj) (dynamic_cast<SPLPEItem*>((SPObject*)obj))
#define SP_IS_LPE_ITEM(obj) (dynamic_cast<const SPLPEItem*>((SPObject*)obj) != NULL)
-class CLPEItem;
class LivePathEffectObject;
class SPCurve;
class SPDesktop;
@@ -58,7 +56,7 @@ public:
virtual void build(SPDocument* doc, Inkscape::XML::Node* repr);
virtual void release();
- virtual void set(unsigned int key, gchar const* value);
+ virtual void set(unsigned int key, char const* value);
virtual void update(SPCtx* ctx, unsigned int flags);
virtual void modified(unsigned int flags);
@@ -66,7 +64,7 @@ public:
virtual void child_added(Inkscape::XML::Node* child, Inkscape::XML::Node* ref);
virtual void remove_child(Inkscape::XML::Node* child);
- virtual Inkscape::XML::Node* write(Inkscape::XML::Document *xml_doc, Inkscape::XML::Node *repr, guint flags);
+ virtual Inkscape::XML::Node* write(Inkscape::XML::Document *xml_doc, Inkscape::XML::Node *repr, unsigned int flags);
virtual void update_patheffect(bool write);
@@ -77,6 +75,7 @@ public:
bool hasPathEffectOfType(int const type) const;
bool hasPathEffectRecursive() const;
Inkscape::LivePathEffect::Effect* getPathEffectOfType(int type);
+ Inkscape::LivePathEffect::Effect const* getPathEffectOfType(int type) const;
bool hasBrokenPathEffect() const;
PathEffectList getEffectList();
@@ -89,16 +88,16 @@ public:
bool setCurrentPathEffect(Inkscape::LivePathEffect::LPEObjectReference* lperef);
void removeCurrentPathEffect(bool keep_paths);
void removeAllPathEffects(bool keep_paths);
- void addPathEffect(gchar *value, bool reset);
+ void addPathEffect(char *value, bool reset);
void addPathEffect(LivePathEffectObject * new_lpeobj);
-
+ void apply_to_mask(SPItem * item);
+ void apply_to_clippath(SPItem * item);
+ void apply_to_clip_or_mask_group(SPItem * group, SPItem * item);
bool forkPathEffectsIfNecessary(unsigned int nr_of_allowed_users = 1);
void editNextParamOncanvas(SPDesktop *dt);
};
-void sp_lpe_item_apply_to_mask(SPItem * item);
-void sp_lpe_item_apply_to_clippath(SPItem * item);
void sp_lpe_item_update_patheffect (SPLPEItem *lpeitem, bool wholetree, bool write); // careful, class already has method with *very* similar name!
#endif /* !SP_LPE_ITEM_H_SEEN */
diff --git a/src/marker.cpp b/src/sp-marker.cpp
index a4cbc30ca..e955594ab 100644
--- a/src/marker.cpp
+++ b/src/sp-marker.cpp
@@ -24,7 +24,7 @@
#include "display/drawing-group.h"
#include "xml/repr.h"
#include "attributes.h"
-#include "marker.h"
+#include "sp-marker.h"
#include "document.h"
#include "document-private.h"
#include "preferences.h"
diff --git a/src/marker.h b/src/sp-marker.h
index 9eefcdf16..b58523251 100644
--- a/src/marker.h
+++ b/src/sp-marker.h
@@ -1,5 +1,5 @@
-#ifndef __SP_MARKER_H__
-#define __SP_MARKER_H__
+#ifndef SEEN_SP_MARKER_H
+#define SEEN_SP_MARKER_H
/*
* SVG <marker> implementation
@@ -12,7 +12,6 @@
*
* Released under GNU GPL, read the file 'COPYING' for more information
*/
-
/*
* This is quite similar in logic to <svg>
* Maybe we should merge them somehow (Lauris)
@@ -26,8 +25,9 @@ struct SPMarkerView;
#include <2geom/rect.h>
#include <2geom/affine.h>
-#include "svg/svg-length.h"
+
#include "enums.h"
+#include "svg/svg-length.h"
#include "sp-item-group.h"
#include "uri-references.h"
#include "viewbox.h"
@@ -93,7 +93,7 @@ Inkscape::DrawingItem *sp_marker_show_instance (SPMarker *marker, Inkscape::Draw
unsigned int key, unsigned int pos,
Geom::Affine const &base, float linewidth);
void sp_marker_hide (SPMarker *marker, unsigned int key);
-const gchar *generate_marker (GSList *reprs, Geom::Rect bounds, SPDocument *document, Geom::Point center, Geom::Affine move);
+const char *generate_marker (GSList *reprs, Geom::Rect bounds, SPDocument *document, Geom::Point center, Geom::Affine move);
SPObject *sp_marker_fork_if_necessary(SPObject *marker);
#endif
diff --git a/src/sp-mask.h b/src/sp-mask.h
index e08d1e81e..e991fedb6 100644
--- a/src/sp-mask.h
+++ b/src/sp-mask.h
@@ -55,12 +55,12 @@ protected:
virtual void child_added(Inkscape::XML::Node* child, Inkscape::XML::Node* ref);
- virtual void set(unsigned int key, const gchar* value);
+ virtual void set(unsigned int key, const char* value);
virtual void update(SPCtx* ctx, unsigned int flags);
virtual void modified(unsigned int flags);
- virtual Inkscape::XML::Node* write(Inkscape::XML::Document* doc, Inkscape::XML::Node* repr, guint flags);
+ virtual Inkscape::XML::Node* write(Inkscape::XML::Document* doc, Inkscape::XML::Node* repr, unsigned int flags);
};
class SPMaskReference : public Inkscape::URIReference {
@@ -86,10 +86,10 @@ protected:
Inkscape::XML::Node * const owner_repr = owner->getRepr();
//XML Tree being used directly here while it shouldn't be...
Inkscape::XML::Node * const obj_repr = obj->getRepr();
- gchar const * owner_name = NULL;
- gchar const * owner_mask = NULL;
- gchar const * obj_name = NULL;
- gchar const * obj_id = NULL;
+ char const * owner_name = NULL;
+ char const * owner_mask = NULL;
+ char const * obj_name = NULL;
+ char const * obj_id = NULL;
if (owner_repr != NULL) {
owner_name = owner_repr->name();
owner_mask = owner_repr->attribute("mask");
@@ -98,7 +98,7 @@ protected:
obj_name = obj_repr->name();
obj_id = obj_repr->attribute("id");
}
- g_warning("Ignoring recursive mask reference "
+ printf("WARNING: Ignoring recursive mask reference "
"<%s mask=\"%s\"> in <%s id=\"%s\">",
owner_name, owner_mask,
obj_name, obj_id);
@@ -108,6 +108,6 @@ protected:
}
};
-const gchar *sp_mask_create (GSList *reprs, SPDocument *document, Geom::Affine const* applyTransform);
+const char *sp_mask_create (GSList *reprs, SPDocument *document, Geom::Affine const* applyTransform);
#endif // SEEN_SP_MASK_H
diff --git a/src/sp-mesh-array.cpp b/src/sp-mesh-array.cpp
index ab14e75d2..8bfe23656 100644
--- a/src/sp-mesh-array.cpp
+++ b/src/sp-mesh-array.cpp
@@ -37,6 +37,15 @@
* Released under GNU GPL, read the file 'COPYING' for more information
*/
+#include <glibmm.h>
+
+// For color picking
+#include "display/drawing.h"
+#include "display/drawing-context.h"
+#include "display/cairo-utils.h"
+#include "document.h"
+#include "sp-root.h"
+
#include "sp-mesh-array.h"
#include "sp-mesh-gradient.h"
#include "sp-mesh-row.h"
@@ -51,13 +60,6 @@
// For writing color/opacity to style
#include "svg/css-ostringstream.h"
-// For color picking
-#include "display/drawing.h"
-#include "display/drawing-context.h"
-#include "display/cairo-utils.h"
-#include "document.h"
-#include "sp-root.h"
-
// For default color
#include "style.h"
#include "svg/svg-color.h"
diff --git a/src/sp-mesh-array.h b/src/sp-mesh-array.h
index b10974e7e..330f6d87b 100644
--- a/src/sp-mesh-array.h
+++ b/src/sp-mesh-array.h
@@ -39,8 +39,6 @@
an array which simplifies things like inserting new rows or columns.
*/
-#include <gdk/gdk.h>
-#include <glibmm/ustring.h>
#include <2geom/point.h>
#include "color.h"
@@ -89,13 +87,13 @@ public:
opacity = 0.0;
}
NodeType node_type;
- guint node_edge;
+ unsigned int node_edge;
bool set;
Geom::Point p;
- guint draggable; // index of on-screen node
- gchar path_type;
+ unsigned int draggable; // index of on-screen node
+ char path_type;
SPColor color;
- gdouble opacity;
+ double opacity;
};
@@ -110,21 +108,21 @@ private:
public:
SPMeshPatchI( std::vector<std::vector< SPMeshNode* > > *n, int r, int c );
- Geom::Point getPoint( guint side, guint point );
- std::vector< Geom::Point > getPointsForSide( guint i );
- void setPoint( guint side, guint point, Geom::Point p, bool set = true );
- gchar getPathType( guint i );
- void setPathType( guint, gchar t );
- Geom::Point getTensorPoint( guint i );
- void setTensorPoint( guint i, Geom::Point p );
+ Geom::Point getPoint( unsigned int side, unsigned int point );
+ std::vector< Geom::Point > getPointsForSide( unsigned int i );
+ void setPoint( unsigned int side, unsigned int point, Geom::Point p, bool set = true );
+ char getPathType( unsigned int i );
+ void setPathType( unsigned int, char t );
+ Geom::Point getTensorPoint( unsigned int i );
+ void setTensorPoint( unsigned int i, Geom::Point p );
bool tensorIsSet();
- bool tensorIsSet( guint i );
- Geom::Point coonsTensorPoint( guint i );
+ bool tensorIsSet( unsigned int i );
+ Geom::Point coonsTensorPoint( unsigned int i );
void updateNodes();
- SPColor getColor( guint i );
- void setColor( guint i, SPColor c );
- gdouble getOpacity( guint i );
- void setOpacity( guint i, gdouble o );
+ SPColor getColor( unsigned int i );
+ void setColor( unsigned int i, SPColor c );
+ double getOpacity( unsigned int i );
+ void setOpacity( unsigned int i, double o );
};
class SPMeshGradient;
@@ -160,26 +158,26 @@ public:
void print();
// Get size of patch
- guint patch_rows();
- guint patch_columns();
+ unsigned int patch_rows();
+ unsigned int patch_columns();
- SPMeshNode * node( guint i, guint j ) { return nodes[i][j]; }
+ SPMeshNode * node( unsigned int i, unsigned int j ) { return nodes[i][j]; }
// Operations on corners
- bool adjacent_corners( guint i, guint j, SPMeshNode* n[4] );
- guint side_toggle( std::vector< guint > );
- guint side_arc( std::vector< guint > );
- guint tensor_toggle( std::vector< guint > );
- guint color_smooth( std::vector< guint > );
- guint color_pick( std::vector< guint >, SPItem* );
+ bool adjacent_corners( unsigned int i, unsigned int j, SPMeshNode* n[4] );
+ unsigned int side_toggle( std::vector< unsigned int > );
+ unsigned int side_arc( std::vector< unsigned int > );
+ unsigned int tensor_toggle( std::vector< unsigned int > );
+ unsigned int color_smooth( std::vector< unsigned int > );
+ unsigned int color_pick( std::vector< unsigned int >, SPItem* );
// Update other nodes in response to a node move.
- void update_handles( guint corner, std::vector< guint > selected_corners, Geom::Point old_p, MeshNodeOperation op );
+ void update_handles( unsigned int corner, std::vector< unsigned int > selected_corners, Geom::Point old_p, MeshNodeOperation op );
- void split_row( guint i, guint n );
- void split_column( guint j, guint n );
- void split_row( guint i, double coord );
- void split_column( guint j, double coord );
+ void split_row( unsigned int i, unsigned int n );
+ void split_column( unsigned int j, unsigned int n );
+ void split_row( unsigned int i, double coord );
+ void split_column( unsigned int j, double coord );
};
#endif /* !SEEN_SP_MESH_ARRAY_H */
diff --git a/src/sp-mesh-gradient.cpp b/src/sp-mesh-gradient.cpp
index eb5ed1bd0..bf28164a9 100644
--- a/src/sp-mesh-gradient.cpp
+++ b/src/sp-mesh-gradient.cpp
@@ -1,8 +1,10 @@
-#include "sp-mesh-gradient.h"
+#include <glibmm.h>
#include "attributes.h"
-#include "xml/repr.h"
#include "display/cairo-utils.h"
+#include "xml/repr.h"
+
+#include "sp-mesh-gradient.h"
#include "sp-factory.h"
diff --git a/src/sp-mesh-gradient.h b/src/sp-mesh-gradient.h
index 0b570c4dd..4df753f62 100644
--- a/src/sp-mesh-gradient.h
+++ b/src/sp-mesh-gradient.h
@@ -24,8 +24,8 @@ public:
protected:
virtual void build(SPDocument *document, Inkscape::XML::Node *repr);
- virtual void set(unsigned key, gchar const *value);
- virtual Inkscape::XML::Node* write(Inkscape::XML::Document *xml_doc, Inkscape::XML::Node *repr, guint flags);
+ virtual void set(unsigned key, char const *value);
+ virtual Inkscape::XML::Node* write(Inkscape::XML::Document *xml_doc, Inkscape::XML::Node *repr, unsigned int flags);
};
#endif /* !SP_MESH_GRADIENT_H */
diff --git a/src/sp-mesh-patch.h b/src/sp-mesh-patch.h
index ddade6503..e57ad1699 100644
--- a/src/sp-mesh-patch.h
+++ b/src/sp-mesh-patch.h
@@ -12,9 +12,7 @@
* Released under GNU GPL, read the file 'COPYING' for more information
*/
-#include <glib.h>
#include <glibmm/ustring.h>
-//#include "svg/svg-length.h"
#include "sp-object.h"
#define SP_MESHPATCH(obj) (dynamic_cast<SPMeshPatch*>((SPObject*)obj))
@@ -34,8 +32,8 @@ public:
protected:
virtual void build(SPDocument* doc, Inkscape::XML::Node* repr);
- virtual void set(unsigned int key, const gchar* value);
- virtual Inkscape::XML::Node* write(Inkscape::XML::Document* doc, Inkscape::XML::Node* repr, guint flags);
+ virtual void set(unsigned int key, const char* value);
+ virtual Inkscape::XML::Node* write(Inkscape::XML::Document* doc, Inkscape::XML::Node* repr, unsigned int flags);
};
#endif /* !SEEN_SP_MESHPATCH_H */
diff --git a/src/sp-mesh-row.h b/src/sp-mesh-row.h
index e39bdc631..793b5a645 100644
--- a/src/sp-mesh-row.h
+++ b/src/sp-mesh-row.h
@@ -11,7 +11,6 @@
* Released under GNU GPL, read the file 'COPYING' for more information
*/
-#include <glib.h>
#include "sp-object.h"
#define SP_MESHROW(obj) (dynamic_cast<SPMeshRow*>((SPObject*)obj))
@@ -28,8 +27,8 @@ public:
protected:
virtual void build(SPDocument* doc, Inkscape::XML::Node* repr);
- virtual void set(unsigned int key, const gchar* value);
- virtual Inkscape::XML::Node* write(Inkscape::XML::Document* doc, Inkscape::XML::Node* repr, guint flags);
+ virtual void set(unsigned int key, const char* value);
+ virtual Inkscape::XML::Node* write(Inkscape::XML::Document* doc, Inkscape::XML::Node* repr, unsigned int flags);
};
#endif /* !SEEN_SP_MESHROW_H */
diff --git a/src/sp-metadata.h b/src/sp-metadata.h
index 2a9d58e11..a89020390 100644
--- a/src/sp-metadata.h
+++ b/src/sp-metadata.h
@@ -1,5 +1,5 @@
-#ifndef __SP_METADATA_H__
-#define __SP_METADATA_H__
+#ifndef SEEN_SP_METADATA_H
+#define SEEN_SP_METADATA_H
/*
* SVG <metadata> implementation
@@ -14,7 +14,6 @@
#include "sp-object.h"
-
/* Metadata base class */
#define SP_METADATA(obj) (dynamic_cast<SPMetadata*>((SPObject*)obj))
@@ -29,9 +28,9 @@ protected:
virtual void build(SPDocument* doc, Inkscape::XML::Node* repr);
virtual void release();
- virtual void set(unsigned int key, const gchar* value);
+ virtual void set(unsigned int key, const char* value);
virtual void update(SPCtx* ctx, unsigned int flags);
- virtual Inkscape::XML::Node* write(Inkscape::XML::Document* doc, Inkscape::XML::Node* repr, guint flags);
+ virtual Inkscape::XML::Node* write(Inkscape::XML::Document* doc, Inkscape::XML::Node* repr, unsigned int flags);
};
SPMetadata * sp_document_metadata (SPDocument *document);
diff --git a/src/sp-missing-glyph.h b/src/sp-missing-glyph.h
index a72ed0e99..06bc92231 100644
--- a/src/sp-missing-glyph.h
+++ b/src/sp-missing-glyph.h
@@ -1,9 +1,5 @@
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
-
-#ifndef __SP_MISSING_GLYPH_H__
-#define __SP_MISSING_GLYPH_H__
+#ifndef SEEN_SP_MISSING_GLYPH_H
+#define SEEN_SP_MISSING_GLYPH_H
/*
* SVG <missing-glyph> element implementation
@@ -31,8 +27,8 @@ public:
protected:
virtual void build(SPDocument* doc, Inkscape::XML::Node* repr);
virtual void release();
- virtual void set(unsigned int key, const gchar* value);
- virtual Inkscape::XML::Node* write(Inkscape::XML::Document* doc, Inkscape::XML::Node* repr, guint flags);
+ virtual void set(unsigned int key, char const* value);
+ virtual Inkscape::XML::Node* write(Inkscape::XML::Document* doc, Inkscape::XML::Node* repr, unsigned int flags);
private:
double horiz_adv_x;
diff --git a/src/sp-namedview.cpp b/src/sp-namedview.cpp
index a01ba891e..8b28347f1 100644
--- a/src/sp-namedview.cpp
+++ b/src/sp-namedview.cpp
@@ -935,7 +935,7 @@ void SPNamedView::hide(SPDesktop const *desktop)
views = g_slist_remove(views, desktop);
}
-void SPNamedView::activateGuides(gpointer desktop, gboolean active)
+void SPNamedView::activateGuides(void* desktop, bool active)
{
g_assert(desktop != NULL);
g_assert(g_slist_find(views, desktop));
@@ -956,14 +956,10 @@ static void sp_namedview_setup_guides(SPNamedView *nv)
static void sp_namedview_show_single_guide(SPGuide* guide, bool show)
{
- for (GSList *v = guide->views; v != NULL; v = v->next) {
- if (show) {
- sp_canvas_item_show(SP_CANVAS_ITEM(v->data));
- sp_canvas_item_show(SP_CANVAS_ITEM(SP_GUIDELINE(v->data)->origin));
- } else {
- sp_canvas_item_hide(SP_CANVAS_ITEM(v->data));
- sp_canvas_item_hide(SP_CANVAS_ITEM(SP_GUIDELINE(v->data)->origin));
- }
+ if (show) {
+ guide->showSPGuide();
+ } else {
+ guide->hideSPGuide();
}
}
@@ -1156,9 +1152,9 @@ Inkscape::CanvasGrid * sp_namedview_get_first_enabled_grid(SPNamedView *namedvie
void SPNamedView::translateGuides(Geom::Translate const &tr) {
for (GSList *l = guides; l != NULL; l = l->next) {
SPGuide &guide = *SP_GUIDE(l->data);
- Geom::Point point_on_line = guide.point_on_line;
+ Geom::Point point_on_line = guide.getPoint();
point_on_line *= tr;
- sp_guide_moveto(guide, point_on_line, true);
+ guide.moveto(point_on_line, true);
}
}
diff --git a/src/sp-namedview.h b/src/sp-namedview.h
index 05cbcc398..37310dc76 100644
--- a/src/sp-namedview.h
+++ b/src/sp-namedview.h
@@ -29,6 +29,9 @@ namespace Inkscape {
}
}
+typedef unsigned int guint32;
+typedef guint32 GQuark;
+
enum {
SP_BORDER_LAYER_BOTTOM,
SP_BORDER_LAYER_TOP
@@ -48,11 +51,11 @@ public:
double zoom;
double cx;
double cy;
- gint window_width;
- gint window_height;
- gint window_x;
- gint window_y;
- gint window_maximized;
+ int window_width;
+ int window_height;
+ int window_x;
+ int window_y;
+ int window_maximized;
SnapManager snap_manager;
GSList * grids;
@@ -74,13 +77,13 @@ public:
GSList *guides;
GSList *views;
- gint viewcount;
+ int viewcount;
void show(SPDesktop *desktop);
void hide(SPDesktop const *desktop);
- void activateGuides(gpointer desktop, gboolean active);
- gchar const *getName() const;
- guint getViewCount();
+ void activateGuides(void* desktop, bool active);
+ char const *getName() const;
+ unsigned int getViewCount();
GSList const *getViewList() const;
Inkscape::Util::Unit const * getDefaultUnit() const;
@@ -100,17 +103,17 @@ private:
protected:
virtual void build(SPDocument *document, Inkscape::XML::Node *repr);
virtual void release();
- virtual void set(unsigned int key, gchar const* value);
+ virtual void set(unsigned int key, char const* value);
virtual void child_added(Inkscape::XML::Node* child, Inkscape::XML::Node* ref);
virtual void remove_child(Inkscape::XML::Node* child);
- virtual Inkscape::XML::Node* write(Inkscape::XML::Document *xml_doc, Inkscape::XML::Node *repr, guint flags);
+ virtual Inkscape::XML::Node* write(Inkscape::XML::Document *xml_doc, Inkscape::XML::Node *repr, unsigned int flags);
};
-SPNamedView *sp_document_namedview(SPDocument *document, gchar const *name);
-SPNamedView const *sp_document_namedview(SPDocument const *document, gchar const *name);
+SPNamedView *sp_document_namedview(SPDocument *document, char const *name);
+SPNamedView const *sp_document_namedview(SPDocument const *document, char const *name);
void sp_namedview_window_from_document(SPDesktop *desktop);
void sp_namedview_document_from_window(SPDesktop *desktop);
diff --git a/src/sp-object-group.h b/src/sp-object-group.h
index 4df346228..dcaa8a1d0 100644
--- a/src/sp-object-group.h
+++ b/src/sp-object-group.h
@@ -30,7 +30,7 @@ protected:
virtual void order_changed(Inkscape::XML::Node* child, Inkscape::XML::Node* old, Inkscape::XML::Node* new_repr);
- virtual Inkscape::XML::Node* write(Inkscape::XML::Document *xml_doc, Inkscape::XML::Node *repr, guint flags);
+ virtual Inkscape::XML::Node* write(Inkscape::XML::Document *xml_doc, Inkscape::XML::Node *repr, unsigned int flags);
};
#endif // SEEN_SP_OBJECTGROUP_H
diff --git a/src/sp-object.cpp b/src/sp-object.cpp
index 65228ec0a..fcff43aa5 100644
--- a/src/sp-object.cpp
+++ b/src/sp-object.cpp
@@ -1406,12 +1406,12 @@ bool SPObject::setDesc(gchar const *desc, bool verbatim)
return setTitleOrDesc(desc, "svg:desc", verbatim);
}
-gchar * SPObject::getTitleOrDesc(gchar const *svg_tagname) const
+char * SPObject::getTitleOrDesc(gchar const *svg_tagname) const
{
- gchar *result = 0;
+ char *result = NULL;
SPObject *elem = findFirstChild(svg_tagname);
if ( elem ) {
- result = g_string_free(elem->textualContent(), FALSE);
+ result = elem->textualContent();
}
return result;
}
@@ -1493,7 +1493,7 @@ SPObject * SPObject::findFirstChild(gchar const *tagname) const
return NULL;
}
-GString * SPObject::textualContent() const
+char* SPObject::textualContent() const
{
GString* text = g_string_new("");
@@ -1502,15 +1502,15 @@ GString * SPObject::textualContent() const
Inkscape::XML::NodeType child_type = child->repr->type();
if (child_type == Inkscape::XML::ELEMENT_NODE) {
- GString * new_text = child->textualContent();
- g_string_append(text, new_text->str);
- g_string_free(new_text, TRUE);
+ char* new_string = child->textualContent();
+ g_string_append(text, new_string);
+ g_free(new_string);
}
else if (child_type == Inkscape::XML::TEXT_NODE) {
g_string_append(text, child->repr->content());
}
}
- return text;
+ return g_string_free(text, FALSE);
}
/*
diff --git a/src/sp-object.h b/src/sp-object.h
index e58f161d6..575198f36 100644
--- a/src/sp-object.h
+++ b/src/sp-object.h
@@ -45,8 +45,9 @@ class SPObject;
#define SP_OBJECT_WRITE_BUILD (1 << 0)
#define SP_OBJECT_WRITE_EXT (1 << 1)
#define SP_OBJECT_WRITE_ALL (1 << 2)
+#define SP_OBJECT_WRITE_NO_CHILDREN (1 << 3)
-#include <glib-object.h>
+#include <cassert>
#include <stddef.h>
#include <sigc++/connection.h>
#include <sigc++/functors/slot.h>
@@ -57,6 +58,7 @@ class SPObject;
class SPCSSAttr;
class SPStyle;
+typedef struct _GSList GSList;
namespace Inkscape {
namespace XML {
@@ -109,8 +111,8 @@ class SPDocument;
class SPIXmlSpace {
public:
SPIXmlSpace(): set(0), value(SP_XML_SPACE_DEFAULT) {};
- guint set : 1;
- guint value : 1;
+ unsigned int set : 1;
+ unsigned int value : 1;
};
/*
@@ -152,7 +154,7 @@ SPObject *sp_object_unref(SPObject *object, SPObject *owner=NULL);
* \pre object points to real object
* @todo need to move this to be a member of SPObject.
*/
-SPObject *sp_object_href(SPObject *object, gpointer owner);
+SPObject *sp_object_href(SPObject *object, void* owner);
/**
* Decrease weak refcount.
@@ -164,7 +166,7 @@ SPObject *sp_object_href(SPObject *object, gpointer owner);
* \pre object points to real object and hrefcount>0
* @todo need to move this to be a member of SPObject.
*/
-SPObject *sp_object_hunref(SPObject *object, gpointer owner);
+SPObject *sp_object_hunref(SPObject *object, void* owner);
/**
* SPObject is an abstract base class of all of the document nodes at the
@@ -183,7 +185,7 @@ SPObject *sp_object_hunref(SPObject *object, gpointer owner);
* provides document level functionality such as the undo stack,
* dictionary and so on. Source: doc/architecture.txt
*/
-class SPObject { // : public GObject {
+class SPObject {
public:
enum CollectionPolicy {
COLLECT_WITH_PARENT,
@@ -209,7 +211,7 @@ private:
SPObject(const SPObject&);
SPObject& operator=(const SPObject&);
- gchar *id; /* Our very own unique id */
+ char *id; /* Our very own unique id */
Inkscape::XML::Node *repr; /* Our xml representation */
public:
int refCount;
@@ -217,7 +219,7 @@ public:
/**
* Returns the objects current ID string.
*/
- gchar const* getId() const;
+ char const* getId() const;
/**
* Returns the XML representation of tree
@@ -281,7 +283,7 @@ public:
typedef Inkscape::Util::ForwardPointerIterator<SPObject const, SiblingIteratorStrategy> ConstSiblingIterator;
bool isSiblingOf(SPObject const *object) const {
- g_return_val_if_fail(object != NULL, false);
+ if (object == NULL) return false;
return this->parent && this->parent == object->parent;
}
@@ -332,26 +334,26 @@ public:
* Gets the author-visible label property for the object or a default if
* no label is defined.
*/
- gchar const *label() const;
+ char const *label() const;
/**
* Returns a default label property for this object.
*/
- gchar const *defaultLabel() const;
+ char const *defaultLabel() const;
/**
* Sets the author-visible label for this object.
*
* @param label the new label.
*/
- void setLabel(gchar const *label);
+ void setLabel(char const *label);
/**
* Returns the title of this object, or NULL if there is none.
* The caller must free the returned string using g_free() - see comment
* for getTitleOrDesc() below.
*/
- gchar *title() const;
+ char *title() const;
/**
* Sets the title of this object.
@@ -359,14 +361,14 @@ public:
* (if any) should be deleted.
* The second argument is optional - @see setTitleOrDesc() below for details.
*/
- bool setTitle(gchar const *title, bool verbatim = false);
+ bool setTitle(char const *title, bool verbatim = false);
/**
* Returns the description of this object, or NULL if there is none.
* The caller must free the returned string using g_free() - see comment
* for getTitleOrDesc() below.
*/
- gchar *desc() const;
+ char *desc() const;
/**
* Sets the description of this object.
@@ -374,7 +376,7 @@ public:
* description (if any) should be deleted.
* The second argument is optional - @see setTitleOrDesc() below for details.
*/
- bool setDesc(gchar const *desc, bool verbatim=false);
+ bool setDesc(char const *desc, bool verbatim=false);
/**
* Set the policy under which this object will be orphan-collected.
@@ -501,9 +503,9 @@ public:
* Indicates that another object supercedes this one.
*/
void setSuccessor(SPObject *successor) {
- g_assert(successor != NULL);
- g_assert(_successor == NULL);
- g_assert(successor->_successor == NULL);
+ assert(successor != NULL);
+ assert(_successor == NULL);
+ assert(successor->_successor == NULL);
sp_object_ref(successor, NULL);
_successor = successor;
}
@@ -655,8 +657,8 @@ public:
sigc::signal<void, SPObject *, unsigned int> _modified_signal;
SPObject *_successor;
CollectionPolicy _collection_policy;
- gchar *_label;
- mutable gchar *_default_label;
+ char *_label;
+ mutable char *_default_label;
// WARNING:
// Methods below should not be used outside of the SP tree,
@@ -690,7 +692,7 @@ public:
unsigned getPosition();
- gchar const * getAttribute(gchar const *name,SPException *ex=NULL) const;
+ char const * getAttribute(char const *name,SPException *ex=NULL) const;
void appendChild(Inkscape::XML::Node *child);
@@ -699,18 +701,18 @@ public:
/**
* Call virtual set() function of object.
*/
- void setKeyValue(unsigned int key, gchar const *value);
+ void setKeyValue(unsigned int key, char const *value);
- void setAttribute(gchar const *key, gchar const *value, SPException *ex=NULL);
+ void setAttribute(char const *key, char const *value, SPException *ex=NULL);
/**
* Read value of key attribute from XML node into object.
*/
- void readAttr(gchar const *key);
+ void readAttr(char const *key);
- gchar const *getTagName(SPException *ex) const;
+ char const *getTagName(SPException *ex) const;
- void removeAttribute(gchar const *key, SPException *ex=NULL);
+ void removeAttribute(char const *key, SPException *ex=NULL);
/**
* Returns an object style property.
@@ -740,13 +742,13 @@ public:
* <use> element instead), we should probably make the caller
* responsible for ascending the repr tree as necessary.
*/
- gchar const *getStyleProperty(gchar const *key, gchar const *def) const;
+ char const *getStyleProperty(char const *key, char const *def) const;
- void setCSS(SPCSSAttr *css, gchar const *attr);
+ void setCSS(SPCSSAttr *css, char const *attr);
- void changeCSS(SPCSSAttr *css, gchar const *attr);
+ void changeCSS(SPCSSAttr *css, char const *attr);
- bool storeAsDouble( gchar const *key, double *val ) const;
+ bool storeAsDouble( char const *key, double *val ) const;
private:
// Private member functions used in the definitions of setTitle(),
@@ -769,7 +771,7 @@ private:
* The return value is true if a change was made to the title/description,
* and usually false otherwise.
*/
- bool setTitleOrDesc(gchar const *value, gchar const *svg_tagname, bool verbatim);
+ bool setTitleOrDesc(char const *value, char const *svg_tagname, bool verbatim);
/**
* Returns the title or description of this object, or NULL if there is none.
@@ -781,20 +783,20 @@ private:
* Consequently, the return value is a newly allocated string (or NULL), and
* must be freed (using g_free()) by the caller.
*/
- gchar * getTitleOrDesc(gchar const *svg_tagname) const;
+ char * getTitleOrDesc(char const *svg_tagname) const;
/**
* Find the first child of this object with a given tag name,
* and return it. Returns NULL if there is no matching child.
*/
- SPObject * findFirstChild(gchar const *tagname) const;
+ SPObject * findFirstChild(char const *tagname) const;
/**
* Return the full textual content of an element (typically all the
* content except the tags).
* Must not be used on anything except elements.
*/
- GString * textualContent() const;
+ char * textualContent() const;
/* Real handlers of repr signals */
@@ -802,17 +804,17 @@ public:
/**
* Callback for attr_changed node event.
*/
- static void repr_attr_changed(Inkscape::XML::Node *repr, gchar const *key, gchar const *oldval, gchar const *newval, bool is_interactive, gpointer data);
+ static void repr_attr_changed(Inkscape::XML::Node *repr, char const *key, char const *oldval, char const *newval, bool is_interactive, void* data);
/**
* Callback for content_changed node event.
*/
- static void repr_content_changed(Inkscape::XML::Node *repr, gchar const *oldcontent, gchar const *newcontent, gpointer data);
+ static void repr_content_changed(Inkscape::XML::Node *repr, char const *oldcontent, char const *newcontent, void* data);
/**
* Callback for child_added node event.
*/
- static void repr_child_added(Inkscape::XML::Node *repr, Inkscape::XML::Node *child, Inkscape::XML::Node *ref, gpointer data);
+ static void repr_child_added(Inkscape::XML::Node *repr, Inkscape::XML::Node *child, Inkscape::XML::Node *ref, void* data);
/**
* Callback for remove_child node event.
@@ -824,7 +826,7 @@ public:
*
* \todo fixme:
*/
- static void repr_order_changed(Inkscape::XML::Node *repr, Inkscape::XML::Node *child, Inkscape::XML::Node *old, Inkscape::XML::Node *newer, gpointer data);
+ static void repr_order_changed(Inkscape::XML::Node *repr, Inkscape::XML::Node *child, Inkscape::XML::Node *old, Inkscape::XML::Node *newer, void* data);
friend class SPObjectImpl;
@@ -838,12 +840,12 @@ protected:
virtual void order_changed(Inkscape::XML::Node* child, Inkscape::XML::Node* old_repr, Inkscape::XML::Node* new_repr);
- virtual void set(unsigned int key, const gchar* value);
+ virtual void set(unsigned int key, const char* value);
virtual void update(SPCtx* ctx, unsigned int flags);
virtual void modified(unsigned int flags);
- virtual Inkscape::XML::Node* write(Inkscape::XML::Document* doc, Inkscape::XML::Node* repr, guint flags);
+ virtual Inkscape::XML::Node* write(Inkscape::XML::Document* doc, Inkscape::XML::Node* repr, unsigned int flags);
public:
virtual void read_content();
diff --git a/src/sp-offset.h b/src/sp-offset.h
index 259a69b78..eb3fe227c 100644
--- a/src/sp-offset.h
+++ b/src/sp-offset.h
@@ -11,11 +11,11 @@
* Released under GNU GPL, read the file 'COPYING' for more information
*/
-#include "sp-shape.h"
-
-#include <stddef.h>
+#include <cstddef>
#include <sigc++/sigc++.h>
+#include "sp-shape.h"
+
#define SP_OFFSET(obj) (dynamic_cast<SPOffset*>((SPObject*)obj))
#define SP_IS_OFFSET(obj) (dynamic_cast<const SPOffset*>((SPObject*)obj) != NULL)
@@ -54,7 +54,7 @@ public:
SPOffset();
virtual ~SPOffset();
- void *originalPath; ///< will be a livarot Path, just don't declare it here to please the gcc linker
+ void *originalPath; ///< will be a livarot Path, just don't declare it here to please the gcc linker FIXME what?
char *original; ///< SVG description of the source path
float rad; ///< offset radius
@@ -65,7 +65,7 @@ public:
bool sourceDirty;
bool isUpdating;
- gchar *sourceHref;
+ char *sourceHref;
SPUseReference *sourceRef;
Inkscape::XML::Node *sourceRepr; ///< the repr associated with that id
SPObject *sourceObject;
@@ -76,14 +76,14 @@ public:
sigc::connection _transformed_connection;
virtual void build(SPDocument *document, Inkscape::XML::Node *repr);
- virtual void set(unsigned int key, gchar const* value);
- virtual void update(SPCtx *ctx, guint flags);
- virtual Inkscape::XML::Node* write(Inkscape::XML::Document *xml_doc, Inkscape::XML::Node *repr, guint flags);
+ virtual void set(unsigned int key, char const* value);
+ virtual void update(SPCtx *ctx, unsigned int flags);
+ virtual Inkscape::XML::Node* write(Inkscape::XML::Document *xml_doc, Inkscape::XML::Node *repr, unsigned flags);
virtual void release();
virtual void snappoints(std::vector<Inkscape::SnapCandidatePoint> &p, Inkscape::SnapPreferences const *snapprefs) const;
virtual const char* displayName() const;
- virtual gchar* description() const;
+ virtual char* description() const;
virtual void set_shape();
};
diff --git a/src/sp-paint-server-reference.h b/src/sp-paint-server-reference.h
index e08694c2f..bbd9c25fa 100644
--- a/src/sp-paint-server-reference.h
+++ b/src/sp-paint-server-reference.h
@@ -15,9 +15,10 @@
* Released under GNU GPL, read the file 'COPYING' for more information
*/
-#include "sp-object.h"
#include "uri-references.h"
+class SPDocument;
+class SPObject;
class SPPaintServer;
class SPPaintServerReference : public Inkscape::URIReference {
diff --git a/src/sp-paint-server.cpp b/src/sp-paint-server.cpp
index af510cd11..ae40ad1aa 100644
--- a/src/sp-paint-server.cpp
+++ b/src/sp-paint-server.cpp
@@ -81,7 +81,6 @@ cairo_pattern_t* SPPaintServer::pattern_new(cairo_t * /*ct*/, Geom::OptRect cons
return NULL;
}
-
/*
Local Variables:
mode:c++
diff --git a/src/sp-path.h b/src/sp-path.h
index 5f8a91d98..572fd648d 100644
--- a/src/sp-path.h
+++ b/src/sp-path.h
@@ -32,7 +32,7 @@ public:
SPPath();
virtual ~SPPath();
- gint nodesInPath() const;
+ int nodesInPath() const;
// still in lowercase because the names should be clearer on whether curve, curve->copy or curve-ref is returned.
void set_original_curve (SPCurve *curve, unsigned int owner, bool write);
@@ -49,13 +49,13 @@ public:
virtual void build(SPDocument *document, Inkscape::XML::Node *repr);
virtual void release();
- virtual void update(SPCtx* ctx, guint flags);
+ virtual void update(SPCtx* ctx, unsigned int flags);
- virtual void set(unsigned int key, gchar const* value);
- virtual Inkscape::XML::Node* write(Inkscape::XML::Document *xml_doc, Inkscape::XML::Node *repr, guint flags);
+ virtual void set(unsigned int key, char const* value);
+ virtual Inkscape::XML::Node* write(Inkscape::XML::Document *xml_doc, Inkscape::XML::Node *repr, unsigned int flags);
virtual const char* displayName() const;
- virtual gchar* description() const;
+ virtual char* description() const;
virtual Geom::Affine set_transform(Geom::Affine const &transform);
virtual void convert_to_guides() const;
diff --git a/src/sp-pattern.cpp b/src/sp-pattern.cpp
index e465565c4..961ab0f84 100644
--- a/src/sp-pattern.cpp
+++ b/src/sp-pattern.cpp
@@ -18,7 +18,9 @@
#include <cstring>
#include <string>
+#include <glibmm.h>
#include <2geom/transforms.h>
+
#include "macros.h"
#include "svg/svg.h"
#include "display/cairo-utils.h"
@@ -541,6 +543,16 @@ static bool pattern_hasItemChildren (SPPattern const *pat)
return hasChildren;
}
+bool SPPattern::isValid() const
+{
+ double tile_width = pattern_width(this);
+ double tile_height = pattern_height(this);
+
+ if (tile_width <= 0 || tile_height <= 0)
+ return false;
+ return true;
+}
+
cairo_pattern_t* SPPattern::pattern_new(cairo_t *base_ct, Geom::OptRect const &bbox, double opacity) {
bool needs_opacity = (1.0 - opacity) >= 1e-3;
@@ -593,7 +605,7 @@ cairo_pattern_t* SPPattern::pattern_new(cairo_t *base_ct, Geom::OptRect const &b
double tile_y = pattern_y(this);
double tile_width = pattern_width(this);
double tile_height = pattern_height(this);
- if (pattern_patternUnits(this) == SP_PATTERN_UNITS_OBJECTBOUNDINGBOX) {
+ if ( bbox && (pattern_patternUnits(this) == SP_PATTERN_UNITS_OBJECTBOUNDINGBOX) ) {
tile_x *= bbox->width();
tile_y *= bbox->height();
tile_width *= bbox->width();
@@ -605,16 +617,17 @@ cairo_pattern_t* SPPattern::pattern_new(cairo_t *base_ct, Geom::OptRect const &b
// Content to tile (pattern space)
Geom::Affine content2ps;
- if (this->viewBox_set) {
+ Geom::OptRect effective_view_box = pattern_viewBox(this);
+ if (effective_view_box) {
// viewBox to pattern server (using SPViewBox)
- viewBox = *pattern_viewBox(this);
+ viewBox = *effective_view_box;
c2p.setIdentity();
apply_viewbox( pattern_tile );
content2ps = c2p;
} else {
// Content to bbox
- if (pattern_patternContentUnits (this) == SP_PATTERN_UNITS_OBJECTBOUNDINGBOX) {
+ if (bbox && (pattern_patternContentUnits(this) == SP_PATTERN_UNITS_OBJECTBOUNDINGBOX) ) {
content2ps = Geom::Affine(bbox->width(), 0.0, 0.0, bbox->height(), 0,0);
}
}
diff --git a/src/sp-pattern.h b/src/sp-pattern.h
index f69ba10b3..f021101e2 100644
--- a/src/sp-pattern.h
+++ b/src/sp-pattern.h
@@ -13,21 +13,18 @@
* Released under GNU GPL, read the file 'COPYING' for more information
*/
-#include <gtk/gtk.h>
-
-#include "sp-item.h"
-
#define SP_PATTERN(obj) (dynamic_cast<SPPattern*>((SPObject*)obj))
#define SP_IS_PATTERN(obj) (dynamic_cast<const SPPattern*>((SPObject*)obj) != NULL)
class SPPatternReference;
+class SPItem;
+typedef struct _GSList GSList;
#include "svg/svg-length.h"
#include "sp-paint-server.h"
#include "uri-references.h"
#include "viewbox.h"
-#include <stddef.h>
#include <sigc++/connection.h>
@@ -37,17 +34,17 @@ public:
virtual ~SPPattern();
/* Reference (href) */
- gchar *href;
+ char *href;
SPPatternReference *ref;
/* patternUnits and patternContentUnits attribute */
- guint patternUnits : 1;
- guint patternUnits_set : 1;
- guint patternContentUnits : 1;
- guint patternContentUnits_set : 1;
+ unsigned int patternUnits : 1;
+ unsigned int patternUnits_set : 1;
+ unsigned int patternContentUnits : 1;
+ unsigned int patternContentUnits_set : 1;
/* patternTransform attribute */
Geom::Affine patternTransform;
- guint patternTransform_set : 1;
+ unsigned int patternTransform_set : 1;
/* Tile rectangle */
SVGLength x;
SVGLength y;
@@ -56,6 +53,8 @@ public:
sigc::connection modified_connection;
+ bool isValid() const;
+
virtual cairo_pattern_t* pattern_new(cairo_t *ct, Geom::OptRect const &bbox, double opacity);
protected:
@@ -85,22 +84,22 @@ enum {
SP_PATTERN_UNITS_OBJECTBOUNDINGBOX
};
-guint pattern_users (SPPattern *pattern);
+unsigned int pattern_users (SPPattern *pattern);
SPPattern *pattern_chain (SPPattern *pattern);
-SPPattern *sp_pattern_clone_if_necessary (SPItem *item, SPPattern *pattern, const gchar *property);
+SPPattern *sp_pattern_clone_if_necessary (SPItem *item, SPPattern *pattern, const char *property);
void sp_pattern_transform_multiply (SPPattern *pattern, Geom::Affine postmul, bool set);
-const gchar *pattern_tile (GSList *reprs, Geom::Rect bounds, SPDocument *document, Geom::Affine transform, Geom::Affine move);
+const char *pattern_tile (GSList *reprs, Geom::Rect bounds, SPDocument *document, Geom::Affine transform, Geom::Affine move);
SPPattern *pattern_getroot (SPPattern *pat);
-guint pattern_patternUnits (SPPattern const *pat);
-guint pattern_patternContentUnits (SPPattern const *pat);
+unsigned int pattern_patternUnits (SPPattern const *pat);
+unsigned int pattern_patternContentUnits (SPPattern const *pat);
Geom::Affine const &pattern_patternTransform(SPPattern const *pat);
-gdouble pattern_x (SPPattern const *pat);
-gdouble pattern_y (SPPattern const *pat);
-gdouble pattern_width (SPPattern const *pat);
-gdouble pattern_height (SPPattern const *pat);
+double pattern_x (SPPattern const *pat);
+double pattern_y (SPPattern const *pat);
+double pattern_width (SPPattern const *pat);
+double pattern_height (SPPattern const *pat);
Geom::OptRect pattern_viewBox (SPPattern const *pat);
#endif // SEEN_SP_PATTERN_H
diff --git a/src/sp-polygon.h b/src/sp-polygon.h
index 41ab245bd..438fdf794 100644
--- a/src/sp-polygon.h
+++ b/src/sp-polygon.h
@@ -1,5 +1,5 @@
-#ifndef __SP_POLYGON_H__
-#define __SP_POLYGON_H__
+#ifndef SEEN_SP_POLYGON_H
+#define SEEN_SP_POLYGON_H
/*
* SVG <polygon> implementation
@@ -15,7 +15,6 @@
#include "sp-shape.h"
-
#define SP_POLYGON(obj) (dynamic_cast<SPPolygon*>((SPObject*)obj))
#define SP_IS_POLYGON(obj) (dynamic_cast<const SPPolygon*>((SPObject*)obj) != NULL)
@@ -25,12 +24,12 @@ public:
virtual ~SPPolygon();
virtual void build(SPDocument *document, Inkscape::XML::Node *repr);
- virtual Inkscape::XML::Node* write(Inkscape::XML::Document *xml_doc, Inkscape::XML::Node *repr, guint flags);
- virtual void set(unsigned int key, gchar const* value);
- virtual gchar* description() const;
+ virtual Inkscape::XML::Node* write(Inkscape::XML::Document *xml_doc, Inkscape::XML::Node *repr, unsigned int flags);
+ virtual void set(unsigned int key, char const* value);
+ virtual char* description() const;
};
// made 'public' so that SPCurve can set it as friend:
-void sp_polygon_set(SPObject *object, unsigned int key, const gchar *value);
+void sp_polygon_set(SPObject *object, unsigned int key, char const*value);
#endif
diff --git a/src/sp-polyline.h b/src/sp-polyline.h
index e24ea95c7..1ca102a9e 100644
--- a/src/sp-polyline.h
+++ b/src/sp-polyline.h
@@ -12,10 +12,10 @@ public:
virtual ~SPPolyLine();
virtual void build(SPDocument* doc, Inkscape::XML::Node* repr);
- virtual void set(unsigned int key, gchar const* value);
- virtual Inkscape::XML::Node* write(Inkscape::XML::Document *xml_doc, Inkscape::XML::Node *repr, guint flags);
+ virtual void set(unsigned int key, char const* value);
+ virtual Inkscape::XML::Node* write(Inkscape::XML::Document *xml_doc, Inkscape::XML::Node *repr, unsigned int flags);
- virtual gchar* description() const;
+ virtual char* description() const;
};
#endif // SEEN_SP_POLYLINE_H
diff --git a/src/sp-radial-gradient.cpp b/src/sp-radial-gradient.cpp
index 7c481fead..2c2b17b7d 100644
--- a/src/sp-radial-gradient.cpp
+++ b/src/sp-radial-gradient.cpp
@@ -1,3 +1,5 @@
+#include <cairo.h>
+
#include "sp-radial-gradient.h"
#include "attributes.h"
diff --git a/src/sp-radial-gradient.h b/src/sp-radial-gradient.h
index 42ff109aa..f753623b7 100644
--- a/src/sp-radial-gradient.h
+++ b/src/sp-radial-gradient.h
@@ -5,10 +5,12 @@
* SPRadialGradient: SVG <radialgradient> implementtion.
*/
-#include <glib.h>
#include "sp-gradient.h"
#include "svg/svg-length.h"
+typedef struct _cairo cairo_t;
+typedef struct _cairo_pattern cairo_pattern_t;
+
#define SP_RADIALGRADIENT(obj) (dynamic_cast<SPRadialGradient*>((SPObject*)obj))
#define SP_IS_RADIALGRADIENT(obj) (dynamic_cast<const SPRadialGradient*>((SPObject*)obj) != NULL)
@@ -28,8 +30,8 @@ public:
protected:
virtual void build(SPDocument *document, Inkscape::XML::Node *repr);
- virtual void set(unsigned key, gchar const *value);
- virtual Inkscape::XML::Node* write(Inkscape::XML::Document *xml_doc, Inkscape::XML::Node *repr, guint flags);
+ virtual void set(unsigned key, char const *value);
+ virtual Inkscape::XML::Node* write(Inkscape::XML::Document *xml_doc, Inkscape::XML::Node *repr, unsigned int flags);
};
#endif /* !SP_RADIAL_GRADIENT_H */
diff --git a/src/sp-rect.h b/src/sp-rect.h
index aa3f88e42..757229724 100644
--- a/src/sp-rect.h
+++ b/src/sp-rect.h
@@ -14,10 +14,10 @@
* Released under GNU GPL, read the file 'COPYING' for more information
*/
-#include "svg/svg-length.h"
-#include "sp-shape.h"
#include <2geom/forward.h>
+#include "svg/svg-length.h"
+#include "sp-shape.h"
#define SP_RECT(obj) (dynamic_cast<SPRect*>((SPObject*)obj))
#define SP_IS_RECT(obj) (dynamic_cast<const SPRect*>((SPObject*)obj) != NULL)
@@ -27,34 +27,34 @@ public:
SPRect();
virtual ~SPRect();
- void setPosition(gdouble x, gdouble y, gdouble width, gdouble height);
+ void setPosition(double x, double y, double width, double height);
/* If SET if FALSE, VALUE is just ignored */
- void setRx(bool set, gdouble value);
- void setRy(bool set, gdouble value);
+ void setRx(bool set, double value);
+ void setRy(bool set, double value);
- gdouble getVisibleRx() const;
- void setVisibleRx(gdouble rx);
+ double getVisibleRx() const;
+ void setVisibleRx(double rx);
- gdouble getVisibleRy() const;
- void setVisibleRy(gdouble ry);
+ double getVisibleRy() const;
+ void setVisibleRy(double ry);
Geom::Rect getRect() const;
- gdouble getVisibleWidth() const;
- void setVisibleWidth(gdouble rx);
+ double getVisibleWidth() const;
+ void setVisibleWidth(double rx);
- gdouble getVisibleHeight() const;
- void setVisibleHeight(gdouble ry);
+ double getVisibleHeight() const;
+ void setVisibleHeight(double ry);
void compensateRxRy(Geom::Affine xform);
virtual void build(SPDocument* doc, Inkscape::XML::Node* repr);
- virtual void set(unsigned key, gchar const *value);
+ virtual void set(unsigned key, char const *value);
virtual void update(SPCtx* ctx, unsigned int flags);
- virtual Inkscape::XML::Node* write(Inkscape::XML::Document *xml_doc, Inkscape::XML::Node *repr, guint flags);
+ virtual Inkscape::XML::Node* write(Inkscape::XML::Document *xml_doc, Inkscape::XML::Node *repr, unsigned int flags);
virtual const char* displayName() const;
virtual void set_shape();
@@ -71,7 +71,7 @@ public:
SVGLength ry;
private:
- static gdouble vectorStretch(Geom::Point p0, Geom::Point p1, Geom::Affine xform);
+ static double vectorStretch(Geom::Point p0, Geom::Point p1, Geom::Affine xform);
};
#endif // SEEN_SP_RECT_H
diff --git a/src/sp-root.h b/src/sp-root.h
index a25e8030c..2776ae887 100644
--- a/src/sp-root.h
+++ b/src/sp-root.h
@@ -40,7 +40,7 @@ public:
SVGLength width;
SVGLength height;
- gchar *onload;
+ char *onload;
/**
* Primary \<defs\> element where we put new defs (patterns, gradients etc.).
@@ -52,9 +52,9 @@ public:
virtual void build(SPDocument *document, Inkscape::XML::Node *repr);
virtual void release();
- virtual void set(unsigned int key, gchar const* value);
- virtual void update(SPCtx *ctx, guint flags);
- virtual Inkscape::XML::Node* write(Inkscape::XML::Document *xml_doc, Inkscape::XML::Node *repr, guint flags);
+ virtual void set(unsigned int key, char const* value);
+ virtual void update(SPCtx *ctx, unsigned int flags);
+ virtual Inkscape::XML::Node* write(Inkscape::XML::Document *xml_doc, Inkscape::XML::Node *repr, unsigned int flags);
virtual void modified(unsigned int flags);
virtual void child_added(Inkscape::XML::Node* child, Inkscape::XML::Node* ref);
diff --git a/src/sp-script.h b/src/sp-script.h
index 36072a0ca..b71f86720 100644
--- a/src/sp-script.h
+++ b/src/sp-script.h
@@ -1,5 +1,5 @@
-#ifndef __SP_SCRIPT_H__
-#define __SP_SCRIPT_H__
+#ifndef SEEN_SP_SCRIPT_H
+#define SEEN_SP_SCRIPT_H
/*
* SVG <script> implementation
@@ -24,15 +24,15 @@ public:
SPScript();
virtual ~SPScript();
- gchar *xlinkhref;
+ char *xlinkhref;
protected:
virtual void build(SPDocument* doc, Inkscape::XML::Node* repr);
virtual void release();
- virtual void set(unsigned int key, const gchar* value);
+ virtual void set(unsigned int key, char const* value);
virtual void update(SPCtx* ctx, unsigned int flags);
virtual void modified(unsigned int flags);
- virtual Inkscape::XML::Node* write(Inkscape::XML::Document* doc, Inkscape::XML::Node* repr, guint flags);
+ virtual Inkscape::XML::Node* write(Inkscape::XML::Document* doc, Inkscape::XML::Node* repr, unsigned int flags);
};
#endif
diff --git a/src/sp-shape.cpp b/src/sp-shape.cpp
index 60e62c761..8b7e735e0 100644
--- a/src/sp-shape.cpp
+++ b/src/sp-shape.cpp
@@ -35,7 +35,7 @@
#include "print.h"
#include "document.h"
#include "style.h"
-#include "marker.h"
+#include "sp-marker.h"
#include "sp-path.h"
#include "preferences.h"
#include "attributes.h"
diff --git a/src/sp-shape.h b/src/sp-shape.h
index ffdd68948..fe9d03275 100644
--- a/src/sp-shape.h
+++ b/src/sp-shape.h
@@ -15,13 +15,13 @@
* Released under GNU GPL, read the file 'COPYING' for more information
*/
-#include "sp-lpe-item.h"
-#include "sp-marker-loc.h"
#include <2geom/forward.h>
-
-#include <stddef.h>
+#include <cstddef>
#include <sigc++/connection.h>
+#include "sp-lpe-item.h"
+#include "sp-marker-loc.h"
+
#define SP_SHAPE(obj) (dynamic_cast<SPShape*>((SPObject*)obj))
#define SP_IS_SHAPE(obj) (dynamic_cast<const SPShape*>((SPObject*)obj) != NULL)
@@ -58,11 +58,11 @@ public:
virtual void build(SPDocument *document, Inkscape::XML::Node *repr);
virtual void release();
- virtual void update(SPCtx* ctx, guint flags);
+ virtual void update(SPCtx* ctx, unsigned int flags);
virtual void modified(unsigned int flags);
- virtual void set(unsigned int key, gchar const* value);
- virtual Inkscape::XML::Node* write(Inkscape::XML::Document *xml_doc, Inkscape::XML::Node *repr, guint flags);
+ virtual void set(unsigned int key, char const* value);
+ virtual Inkscape::XML::Node* write(Inkscape::XML::Document *xml_doc, Inkscape::XML::Node *repr, unsigned int flags);
virtual Geom::OptRect bbox(Geom::Affine const &transform, SPItem::BBoxType bboxtype) const;
virtual void print(SPPrintContext* ctx);
@@ -76,7 +76,7 @@ public:
};
-void sp_shape_set_marker (SPObject *object, unsigned int key, const gchar *value);
+void sp_shape_set_marker (SPObject *object, unsigned int key, const char *value);
Geom::Affine sp_shape_marker_get_transform(Geom::Curve const & c1, Geom::Curve const & c2);
Geom::Affine sp_shape_marker_get_transform_at_start(Geom::Curve const & c);
diff --git a/src/sp-solid-color.cpp b/src/sp-solid-color.cpp
index 9f6692f98..0d6b96b62 100644
--- a/src/sp-solid-color.cpp
+++ b/src/sp-solid-color.cpp
@@ -8,6 +8,8 @@
*
* Released under GNU GPL, read the file 'COPYING' for more information
*/
+#include <cairo.h>
+
#include "sp-solid-color.h"
#include "attributes.h"
diff --git a/src/sp-solid-color.h b/src/sp-solid-color.h
index 0ff09762e..4dbb573b0 100644
--- a/src/sp-solid-color.h
+++ b/src/sp-solid-color.h
@@ -11,10 +11,12 @@
* Released under GNU GPL, read the file 'COPYING' for more information
*/
-#include <glib.h>
#include "color.h"
#include "sp-paint-server.h"
+typedef struct _cairo cairo_t;
+typedef struct _cairo_pattern cairo_pattern_t;
+
#define SP_SOLIDCOLOR(obj) (dynamic_cast<SPSolidColor*>((SPObject*)obj))
#define SP_IS_SOLIDCOLOR(obj) (dynamic_cast<const SPSolidColor*>((SPObject*)obj) != NULL)
@@ -28,8 +30,8 @@ public:
protected:
virtual void build(SPDocument* doc, Inkscape::XML::Node* repr);
- virtual void set(unsigned int key, const gchar* value);
- virtual Inkscape::XML::Node* write(Inkscape::XML::Document* doc, Inkscape::XML::Node* repr, guint flags);
+ virtual void set(unsigned int key, char const* value);
+ virtual Inkscape::XML::Node* write(Inkscape::XML::Document* doc, Inkscape::XML::Node* repr, unsigned int flags);
};
#endif /* !SEEN_SP_SOLIDCOLOR_H */
diff --git a/src/sp-spiral.h b/src/sp-spiral.h
index 64b95d951..94724685c 100644
--- a/src/sp-spiral.h
+++ b/src/sp-spiral.h
@@ -52,29 +52,29 @@ public:
float t0;
/* Lowlevel interface */
- void setPosition(gdouble cx, gdouble cy, gdouble exp, gdouble revo, gdouble rad, gdouble arg, gdouble t0);
+ void setPosition(double cx, double cy, double exp, double revo, double rad, double arg, double t0);
virtual Geom::Affine set_transform(Geom::Affine const& xform);
- Geom::Point getXY(gdouble t) const;
+ Geom::Point getXY(double t) const;
- void getPolar(gdouble t, gdouble* rad, gdouble* arg) const;
+ void getPolar(double t, double* rad, double* arg) const;
bool isInvalid() const;
virtual void build(SPDocument* doc, Inkscape::XML::Node* repr);
- virtual Inkscape::XML::Node* write(Inkscape::XML::Document *xml_doc, Inkscape::XML::Node *repr, guint flags);
- virtual void update(SPCtx *ctx, guint flags);
- virtual void set(unsigned int key, gchar const* value);
+ virtual Inkscape::XML::Node* write(Inkscape::XML::Document *xml_doc, Inkscape::XML::Node *repr, unsigned int flags);
+ virtual void update(SPCtx *ctx, unsigned int flags);
+ virtual void set(unsigned int key, char const* value);
virtual void snappoints(std::vector<Inkscape::SnapCandidatePoint> &p, Inkscape::SnapPreferences const *snapprefs) const;
virtual const char* displayName() const;
- virtual gchar* description() const;
+ virtual char* description() const;
virtual void set_shape();
virtual void update_patheffect(bool write);
private:
- Geom::Point getTangent(gdouble t) const;
+ Geom::Point getTangent(double t) const;
void fitAndDraw(SPCurve* c, double dstep, Geom::Point darray[], Geom::Point const& hat1, Geom::Point& hat2, double* t) const;
};
diff --git a/src/sp-star.h b/src/sp-star.h
index 0070ce685..1ebe3298a 100644
--- a/src/sp-star.h
+++ b/src/sp-star.h
@@ -1,5 +1,5 @@
-#ifndef __SP_STAR_H__
-#define __SP_STAR_H__
+#ifndef SEEN_SP_STAR_H
+#define SEEN_SP_STAR_H
/*
* <sodipodi:star> implementation
@@ -30,7 +30,7 @@ public:
SPStar();
virtual ~SPStar();
- gint sides;
+ int sides;
Geom::Point center;
double r[2];
@@ -46,12 +46,12 @@ public:
// What does polygon have that shape doesn't?
virtual void build(SPDocument *document, Inkscape::XML::Node *repr);
- virtual Inkscape::XML::Node* write(Inkscape::XML::Document *xml_doc, Inkscape::XML::Node *repr, guint flags);
- virtual void set(unsigned int key, gchar const* value);
- virtual void update(SPCtx* ctx, guint flags);
+ virtual Inkscape::XML::Node* write(Inkscape::XML::Document *xml_doc, Inkscape::XML::Node *repr, unsigned int flags);
+ virtual void set(unsigned int key, char const* value);
+ virtual void update(SPCtx* ctx, unsigned int flags);
virtual const char* displayName() const;
- virtual gchar* description() const;
+ virtual char* description() const;
virtual void snappoints(std::vector<Inkscape::SnapCandidatePoint> &p, Inkscape::SnapPreferences const *snapprefs) const;
virtual void update_patheffect(bool write);
@@ -59,9 +59,9 @@ public:
virtual Geom::Affine set_transform(Geom::Affine const& xform);
};
-void sp_star_position_set (SPStar *star, gint sides, Geom::Point center, gdouble r1, gdouble r2, gdouble arg1, gdouble arg2, bool isflat, double rounded, double randomized);
+void sp_star_position_set (SPStar *star, int sides, Geom::Point center, double r1, double r2, double arg1, double arg2, bool isflat, double rounded, double randomized);
-Geom::Point sp_star_get_xy (SPStar const *star, SPStarPoint point, gint index, bool randomized = false);
+Geom::Point sp_star_get_xy (SPStar const *star, SPStarPoint point, int index, bool randomized = false);
diff --git a/src/sp-stop.h b/src/sp-stop.h
index b1996e054..f7b3a677a 100644
--- a/src/sp-stop.h
+++ b/src/sp-stop.h
@@ -5,12 +5,13 @@
* SPStop: SVG <stop> implementation.
*/
/*
- * Authors?
+ * Authors:
*/
#include "sp-object.h"
#include "color.h"
-#include <glib.h>
+
+typedef unsigned int guint32;
namespace Glib {
class ustring;
@@ -26,7 +27,7 @@ public:
virtual ~SPStop();
/// \todo fixme: Should be SPSVGPercentage
- gfloat offset;
+ float offset;
bool currentColor;
@@ -37,7 +38,7 @@ public:
SPColor specified_color;
/// \todo fixme: Implement SPSVGNumber or something similar.
- gfloat opacity;
+ float opacity;
Glib::ustring * path_string;
//SPCurve path;
@@ -53,8 +54,8 @@ public:
protected:
virtual void build(SPDocument* doc, Inkscape::XML::Node* repr);
- virtual void set(unsigned int key, const gchar* value);
- virtual Inkscape::XML::Node* write(Inkscape::XML::Document* doc, Inkscape::XML::Node* repr, guint flags);
+ virtual void set(unsigned int key, const char* value);
+ virtual Inkscape::XML::Node* write(Inkscape::XML::Document* doc, Inkscape::XML::Node* repr, unsigned int flags);
};
diff --git a/src/sp-string.h b/src/sp-string.h
index eabf76353..b80b4b8bf 100644
--- a/src/sp-string.h
+++ b/src/sp-string.h
@@ -1,5 +1,5 @@
-#ifndef __SP_STRING_H__
-#define __SP_STRING_H__
+#ifndef SEEN_SP_STRING_H
+#define SEEN_SP_STRING_H
/*
* string elements
diff --git a/src/sp-style-elem.h b/src/sp-style-elem.h
index 8e8a2b3a8..766770216 100644
--- a/src/sp-style-elem.h
+++ b/src/sp-style-elem.h
@@ -16,9 +16,9 @@ public:
bool is_css;
virtual void build(SPDocument* doc, Inkscape::XML::Node* repr);
- virtual void set(unsigned int key, gchar const* value);
+ virtual void set(unsigned int key, char const* value);
virtual void read_content();
- virtual Inkscape::XML::Node* write(Inkscape::XML::Document* doc, Inkscape::XML::Node* repr, guint flags);
+ virtual Inkscape::XML::Node* write(Inkscape::XML::Document* doc, Inkscape::XML::Node* repr, unsigned int flags);
};
diff --git a/src/sp-switch.h b/src/sp-switch.h
index c35982860..4fce1f5a6 100644
--- a/src/sp-switch.h
+++ b/src/sp-switch.h
@@ -1,5 +1,5 @@
-#ifndef __SP_SWITCH_H__
-#define __SP_SWITCH_H__
+#ifndef SEEN_SP_SWITCH_H
+#define SEEN_SP_SWITCH_H
/*
* SVG <switch> implementation
@@ -12,10 +12,12 @@
* Released under GNU GPL, read the file 'COPYING' for more information
*/
+#include <cstddef>
+#include <sigc++/connection.h>
+
#include "sp-item-group.h"
-#include <stddef.h>
-#include <sigc++/connection.h>
+typedef struct _GSList GSList;
#define SP_SWITCH(obj) (dynamic_cast<SPSwitch*>((SPObject*)obj))
#define SP_IS_SWITCH(obj) (dynamic_cast<const SPSwitch*>((SPObject*)obj) != NULL)
diff --git a/src/sp-symbol.h b/src/sp-symbol.h
index a2e769cc2..6b46a8c1a 100644
--- a/src/sp-symbol.h
+++ b/src/sp-symbol.h
@@ -1,5 +1,5 @@
-#ifndef __SP_SYMBOL_H__
-#define __SP_SYMBOL_H__
+#ifndef SEEN_SP_SYMBOL_H
+#define SEEN_SP_SYMBOL_H
/*
* SVG <symbol> implementation
@@ -17,14 +17,14 @@
* Maybe we should merge them somehow (Lauris)
*/
-#define SP_TYPE_SYMBOL (sp_symbol_get_type ())
-#define SP_SYMBOL(obj) (dynamic_cast<SPSymbol*>((SPObject*)obj))
-#define SP_IS_SYMBOL(obj) (dynamic_cast<const SPSymbol*>((SPObject*)obj) != NULL)
-
#include <2geom/affine.h>
#include "sp-item-group.h"
#include "viewbox.h"
+#define SP_TYPE_SYMBOL (sp_symbol_get_type ())
+#define SP_SYMBOL(obj) (dynamic_cast<SPSymbol*>((SPObject*)obj))
+#define SP_IS_SYMBOL(obj) (dynamic_cast<const SPSymbol*>((SPObject*)obj) != NULL)
+
class SPSymbol : public SPGroup, public SPViewBox {
public:
SPSymbol();
@@ -32,9 +32,9 @@ public:
virtual void build(SPDocument *document, Inkscape::XML::Node *repr);
virtual void release();
- virtual void set(unsigned int key, gchar const* value);
- virtual void update(SPCtx *ctx, guint flags);
- virtual Inkscape::XML::Node* write(Inkscape::XML::Document *xml_doc, Inkscape::XML::Node *repr, guint flags);
+ virtual void set(unsigned int key, char const* value);
+ virtual void update(SPCtx *ctx, unsigned int flags);
+ virtual Inkscape::XML::Node* write(Inkscape::XML::Document *xml_doc, Inkscape::XML::Node *repr, unsigned int flags);
virtual void modified(unsigned int flags);
virtual void child_added(Inkscape::XML::Node* child, Inkscape::XML::Node* ref);
diff --git a/src/sp-tag-use-reference.cpp b/src/sp-tag-use-reference.cpp
new file mode 100644
index 000000000..50c011812
--- /dev/null
+++ b/src/sp-tag-use-reference.cpp
@@ -0,0 +1,156 @@
+/*
+ * The reference corresponding to href of <inkscape:tagref> element.
+ *
+ * Copyright (C) Theodore Janeczko 2012-2014 <flutterguy317@gmail.com>
+ *
+ * Released under GNU GPL, read the file 'COPYING' for more information.
+ */
+
+#include <cstring>
+#include <string>
+#include <string.h>
+
+#include "enums.h"
+#include "sp-tag-use-reference.h"
+
+#include "display/curve.h"
+#include "livarot/Path.h"
+#include "preferences.h"
+#include "sp-shape.h"
+#include "sp-text.h"
+#include "uri.h"
+
+#if 0
+namespace {
+ SPObject* createTagUseReference() {
+ return new SPTag();
+ }
+ bool tagUseReferencesRegistered = SPFactory::instance().registerObject("inkscape:tag", createTag);
+}
+// this SPObject doesn't need to be registered
+#endif
+
+
+bool SPTagUseReference::_acceptObject(SPObject * const obj) const
+{
+ if (SP_IS_ITEM(obj)) {
+ SPObject * const owner = getOwner();
+ // Refuse references to us or to an ancestor.
+ for ( SPObject *iter = owner ; iter ; iter = iter->parent ) {
+ if ( iter == obj ) {
+ return false;
+ }
+ }
+ return true;
+ } else {
+ return false;
+ }
+}
+
+
+static void sp_usepath_href_changed(SPObject *old_ref, SPObject *ref, SPTagUsePath *offset);
+static void sp_usepath_delete_self(SPObject *deleted, SPTagUsePath *offset);
+
+SPTagUsePath::SPTagUsePath(SPObject* i_owner):SPTagUseReference(i_owner)
+{
+ owner=i_owner;
+ originalPath = NULL;
+ sourceDirty=false;
+ sourceHref = NULL;
+ sourceRepr = NULL;
+ sourceObject = NULL;
+ _changed_connection = changedSignal().connect(sigc::bind(sigc::ptr_fun(sp_usepath_href_changed), this)); // listening to myself, this should be virtual instead
+
+ user_unlink = NULL;
+}
+
+SPTagUsePath::~SPTagUsePath(void)
+{
+ delete originalPath;
+ originalPath = NULL;
+
+ _changed_connection.disconnect(); // to do before unlinking
+
+ quit_listening();
+ unlink();
+}
+
+void
+SPTagUsePath::link(char *to)
+{
+ if ( to == NULL ) {
+ quit_listening();
+ unlink();
+ } else {
+ if ( !sourceHref || ( strcmp(to, sourceHref) != 0 ) ) {
+ g_free(sourceHref);
+ sourceHref = g_strdup(to);
+ try {
+ attach(Inkscape::URI(to));
+ } catch (Inkscape::BadURIException &e) {
+ /* TODO: Proper error handling as per
+ * http://www.w3.org/TR/SVG11/implnote.html#ErrorProcessing.
+ */
+ g_warning("%s", e.what());
+ detach();
+ }
+ }
+ }
+}
+
+void
+SPTagUsePath::unlink(void)
+{
+ g_free(sourceHref);
+ sourceHref = NULL;
+ detach();
+}
+
+void
+SPTagUsePath::start_listening(SPObject* to)
+{
+ if ( to == NULL ) {
+ return;
+ }
+ sourceObject = to;
+ sourceRepr = to->getRepr();
+ _delete_connection = to->connectDelete(sigc::bind(sigc::ptr_fun(&sp_usepath_delete_self), this));
+}
+
+void
+SPTagUsePath::quit_listening(void)
+{
+ if ( sourceObject == NULL ) {
+ return;
+ }
+ _delete_connection.disconnect();
+ sourceRepr = NULL;
+ sourceObject = NULL;
+}
+
+static void
+sp_usepath_href_changed(SPObject */*old_ref*/, SPObject */*ref*/, SPTagUsePath *offset)
+{
+ offset->quit_listening();
+ SPItem *refobj = offset->getObject();
+ if ( refobj ) {
+ offset->start_listening(refobj);
+ }
+}
+
+static void
+sp_usepath_delete_self(SPObject */*deleted*/, SPTagUsePath *offset)
+{
+ offset->owner->deleteObject();
+}
+
+/*
+ Local Variables:
+ mode:c++
+ c-file-style:"stroustrup"
+ c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
+ indent-tabs-mode:nil
+ fill-column:99
+ End:
+*/
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4 :
diff --git a/src/sp-tag-use-reference.h b/src/sp-tag-use-reference.h
new file mode 100644
index 000000000..2a59fd6bd
--- /dev/null
+++ b/src/sp-tag-use-reference.h
@@ -0,0 +1,78 @@
+#ifndef SEEN_SP_TAG_USE_REFERENCE_H
+#define SEEN_SP_TAG_USE_REFERENCE_H
+
+/*
+ * The reference corresponding to href of <inkscape:tagref> element.
+ *
+ * Copyright (C) Theodore Janeczko 2012-2014 <flutterguy317@gmail.com>
+ *
+ * Released under GNU GPL, read the file 'COPYING' for more information.
+ */
+
+#include <glib.h>
+#include "sp-object.h"
+#include "sp-item.h"
+#include <uri-references.h>
+#include <stddef.h>
+#include <sigc++/sigc++.h>
+
+class Path;
+
+namespace Inkscape {
+namespace XML {
+ class Node;
+}
+}
+
+
+class SPTagUseReference : public Inkscape::URIReference {
+public:
+ SPTagUseReference(SPObject *owner) : URIReference(owner) {}
+
+ SPItem *getObject() const {
+ return static_cast<SPItem *>(URIReference::getObject());
+ }
+
+protected:
+ virtual bool _acceptObject(SPObject * const obj) const;
+
+};
+
+
+class SPTagUsePath : public SPTagUseReference {
+public:
+ Path *originalPath;
+ bool sourceDirty;
+
+ SPObject *owner;
+ gchar *sourceHref;
+ Inkscape::XML::Node *sourceRepr;
+ SPObject *sourceObject;
+
+ sigc::connection _delete_connection;
+ sigc::connection _changed_connection;
+
+ SPTagUsePath(SPObject* i_owner);
+ ~SPTagUsePath(void);
+
+ void link(char* to);
+ void unlink(void);
+ void start_listening(SPObject* to);
+ void quit_listening(void);
+ void refresh_source(void);
+
+ void (*user_unlink) (SPObject *user);
+};
+
+#endif /* !SEEN_SP_USE_REFERENCE_H */
+
+/*
+ Local Variables:
+ mode:c++
+ c-file-style:"stroustrup"
+ c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
+ indent-tabs-mode:nil
+ fill-column:99
+ End:
+*/
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4 :
diff --git a/src/sp-tag-use.cpp b/src/sp-tag-use.cpp
new file mode 100644
index 000000000..5851598f2
--- /dev/null
+++ b/src/sp-tag-use.cpp
@@ -0,0 +1,206 @@
+/*
+ * SVG <inkscape:tagref> implementation
+ *
+ * Authors:
+ * Theodore Janeczko
+ * Liam P White
+ *
+ * Copyright (C) Theodore Janeczko 2012-2014 <flutterguy317@gmail.com>
+ *
+ * Released under GNU GPL, read the file 'COPYING' for more information
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <cstring>
+#include <string>
+
+#include <glibmm/i18n.h>
+#include "display/drawing-group.h"
+#include "attributes.h"
+#include "document.h"
+#include "uri.h"
+#include "xml/repr.h"
+#include "preferences.h"
+#include "style.h"
+#include "sp-factory.h"
+#include "sp-symbol.h"
+#include "sp-tag-use.h"
+#include "sp-tag-use-reference.h"
+
+namespace {
+ SPObject* createTagUse() {
+ return new SPTagUse();
+ }
+ bool tagUseRegistered = SPFactory::instance().registerObject("inkscape:tagref", createTagUse);
+}
+
+SPTagUse::SPTagUse()
+{
+ href = NULL;
+ //new (_changed_connection) sigc::connection;
+ ref = new SPTagUseReference(this);
+
+ _changed_connection = ref->changedSignal().connect(sigc::mem_fun(*this, &SPTagUse::href_changed));
+}
+
+SPTagUse::~SPTagUse()
+{
+
+ if (child) {
+ detach(child);
+ child = NULL;
+ }
+
+ ref->detach();
+ delete ref;
+ ref = 0;
+
+ _changed_connection.~connection(); //FIXME why?
+}
+
+void
+SPTagUse::build(SPDocument *document, Inkscape::XML::Node *repr)
+{
+ SPObject::build(document, repr);
+ readAttr( "xlink:href" );
+
+ // We don't need to create child here:
+ // reading xlink:href will attach ref, and that will cause the changed signal to be emitted,
+ // which will call sp_tag_use_href_changed, and that will take care of the child
+}
+
+void
+SPTagUse::release()
+{
+
+ if (child) {
+ detach(child);
+ child = NULL;
+ }
+
+ _changed_connection.disconnect();
+
+ g_free(href);
+ href = NULL;
+
+ ref->detach();
+
+ SPObject::release();
+}
+
+void
+SPTagUse::set(unsigned key, gchar const *value)
+{
+
+ switch (key) {
+ case SP_ATTR_XLINK_HREF: {
+ if ( value && href && ( strcmp(value, href) == 0 ) ) {
+ /* No change, do nothing. */
+ } else {
+ g_free(href);
+ href = NULL;
+ if (value) {
+ // First, set the href field, because sp_tag_use_href_changed will need it.
+ href = g_strdup(value);
+
+ // Now do the attaching, which emits the changed signal.
+ try {
+ ref->attach(Inkscape::URI(value));
+ } catch (Inkscape::BadURIException &e) {
+ g_warning("%s", e.what());
+ ref->detach();
+ }
+ } else {
+ ref->detach();
+ }
+ }
+ break;
+ }
+
+ default:
+ SPObject::set(key, value);
+ break;
+ }
+}
+
+Inkscape::XML::Node *
+SPTagUse::write(Inkscape::XML::Document *xml_doc, Inkscape::XML::Node *repr, guint flags)
+{
+ if ((flags & SP_OBJECT_WRITE_BUILD) && !repr) {
+ repr = xml_doc->createElement("inkscape:tagref");
+ }
+
+ SPObject::write(xml_doc, repr, flags);
+
+ if (ref->getURI()) {
+ gchar *uri_string = ref->getURI()->toString();
+ repr->setAttribute("xlink:href", uri_string);
+ g_free(uri_string);
+ }
+
+ return repr;
+}
+
+/**
+ * Returns the ultimate original of a SPTagUse (i.e. the first object in the chain of its originals
+ * which is not an SPTagUse). If no original is found, NULL is returned (it is the responsibility
+ * of the caller to make sure that this is handled correctly).
+ *
+ * Note that the returned is the clone object, i.e. the child of an SPTagUse (of the argument one for
+ * the trivial case) and not the "true original".
+ */
+
+SPItem * SPTagUse::root()
+{
+ SPObject *orig = child;
+ while (orig && SP_IS_TAG_USE(orig)) {
+ orig = SP_TAG_USE(orig)->child;
+ }
+ if (!orig || !SP_IS_ITEM(orig))
+ return NULL;
+ return SP_ITEM(orig);
+}
+
+void
+SPTagUse::href_changed(SPObject */*old_ref*/, SPObject */*ref*/)
+{
+ if (href) {
+ SPItem *refobj = ref->getObject();
+ if (refobj) {
+ Inkscape::XML::Node *childrepr = refobj->getRepr();
+ const std::string typeString = NodeTraits::get_type_string(*childrepr);
+
+ SPObject* child_ = SPFactory::instance().createObject(typeString);
+ if (child_) {
+ child = child_;
+ attach(child_, lastChild());
+ sp_object_unref(child_, 0);
+ child_->invoke_build(this->document, childrepr, TRUE);
+
+ }
+ }
+ }
+}
+
+SPItem * SPTagUse::get_original()
+{
+ SPItem *ref_ = NULL;
+ if (ref) {
+ ref_ = ref->getObject();
+ }
+ return ref_;
+}
+
+/*
+ Local Variables:
+ mode:c++
+ c-file-style:"stroustrup"
+ c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
+ indent-tabs-mode:nil
+ fill-column:99
+ End:
+*/
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4 :
diff --git a/src/sp-tag-use.h b/src/sp-tag-use.h
new file mode 100644
index 000000000..3f238d654
--- /dev/null
+++ b/src/sp-tag-use.h
@@ -0,0 +1,55 @@
+#ifndef __SP_TAG_USE_H__
+#define __SP_TAG_USE_H__
+
+/*
+ * SVG <inkscape:tagref> implementation
+ *
+ * Authors:
+ * Theodore Janeczko
+ *
+ * Copyright (C) Theodore Janeczko 2012 <flutterguy317@gmail.com>
+ *
+ * Released under GNU GPL, read the file 'COPYING' for more information
+ */
+
+#include <glib.h>
+#include <stddef.h>
+#include <sigc++/sigc++.h>
+#include "svg/svg-length.h"
+#include "sp-object.h"
+
+
+#define SP_TAG_USE(obj) (dynamic_cast<SPTagUse*> (obj))
+#define SP_IS_TAG_USE(obj) (dynamic_cast<SPTagUse*> (obj) != NULL)
+
+class SPTagUse;
+class SPTagUseReference;
+
+class SPTagUse : public SPObject {
+
+public:
+ // item built from the original's repr (the visible clone)
+ // relative to the SPUse itself, it is treated as a child, similar to a grouped item relative to its group
+ SPObject *child;
+ gchar *href;
+public:
+ SPTagUse();
+ virtual ~SPTagUse();
+
+ virtual void build(SPDocument *doc, Inkscape::XML::Node *repr);
+ virtual void set(unsigned key, gchar const *value);
+ virtual Inkscape::XML::Node* write(Inkscape::XML::Document* doc, Inkscape::XML::Node* repr, guint flags);
+ virtual void release();
+
+ virtual void href_changed(SPObject* old_ref, SPObject* ref);
+
+ //virtual SPItem* unlink();
+ virtual SPItem* get_original();
+ virtual SPItem* root();
+
+ // the reference to the original object
+ SPTagUseReference *ref;
+ sigc::connection _changed_connection;
+};
+
+#endif
diff --git a/src/sp-tag.cpp b/src/sp-tag.cpp
new file mode 100644
index 000000000..c4b40417f
--- /dev/null
+++ b/src/sp-tag.cpp
@@ -0,0 +1,154 @@
+/** \file
+ * SVG <inkscape:tag> implementation
+ *
+ * Authors:
+ * Theodore Janeczko
+ * Liam P. White
+ *
+ * Copyright (C) Theodore Janeczko 2012-2014 <flutterguy317@gmail.com>
+ *
+ * Released under GNU GPL, read the file 'COPYING' for more information
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include "attributes.h"
+#include "sp-factory.h"
+#include "sp-tag.h"
+#include "xml/repr.h"
+#include <cstring>
+
+namespace {
+ SPObject* createTag() {
+ return new SPTag();
+ }
+ bool tagsRegistered = SPFactory::instance().registerObject("inkscape:tag", createTag);
+}
+
+/*
+ * Move this SPItem into or after another SPItem in the doc
+ * \param target - the SPItem to move into or after
+ * \param intoafter - move to after the target (false), move inside (sublayer) of the target (true)
+ */
+void SPTag::moveTo(SPObject *target, gboolean intoafter) {
+
+ Inkscape::XML::Node *target_ref = ( target ? target->getRepr() : NULL );
+ Inkscape::XML::Node *our_ref = getRepr();
+ gboolean first = FALSE;
+
+ if (target_ref == our_ref) {
+ // Move to ourself ignore
+ return;
+ }
+
+ if (!target_ref) {
+ // Assume move to the "first" in the top node, find the top node
+ target_ref = our_ref;
+ while (target_ref->parent() != target_ref->root()) {
+ target_ref = target_ref->parent();
+ }
+ first = TRUE;
+ }
+
+ if (intoafter) {
+ // Move this inside of the target at the end
+ our_ref->parent()->removeChild(our_ref);
+ target_ref->addChild(our_ref, NULL);
+ } else if (target_ref->parent() != our_ref->parent()) {
+ // Change in parent, need to remove and add
+ our_ref->parent()->removeChild(our_ref);
+ target_ref->parent()->addChild(our_ref, target_ref);
+ } else if (!first) {
+ // Same parent, just move
+ our_ref->parent()->changeOrder(our_ref, target_ref);
+ }
+}
+
+/**
+ * Reads the Inkscape::XML::Node, and initializes SPTag variables. For this to get called,
+ * our name must be associated with a repr via "sp_object_type_register". Best done through
+ * sp-object-repr.cpp's repr_name_entries array.
+ */
+void
+SPTag::build(SPDocument *document, Inkscape::XML::Node *repr)
+{
+ readAttr( "inkscape:expanded" );
+ SPObject::build(document, repr);
+}
+
+/**
+ * Sets a specific value in the SPTag.
+ */
+void
+SPTag::set(unsigned int key, gchar const *value)
+{
+
+ switch (key)
+ {
+ case SP_ATTR_INKSCAPE_EXPANDED:
+ if ( value && !strcmp(value, "true") ) {
+ setExpanded(true);
+ }
+ break;
+ default:
+ SPObject::set(key, value);
+ break;
+ }
+}
+
+void SPTag::setExpanded(bool isexpanded) {
+ //if ( _expanded != isexpanded ){
+ _expanded = isexpanded;
+ //}
+}
+
+/**
+ * Receives update notifications.
+ */
+void
+SPTag::update(SPCtx *ctx, guint flags)
+{
+ if (flags & (SP_OBJECT_MODIFIED_FLAG | SP_OBJECT_STYLE_MODIFIED_FLAG |
+ SP_OBJECT_VIEWPORT_MODIFIED_FLAG)) {
+
+ /* do something to trigger redisplay, updates? */
+
+ }
+ SPObject::update(ctx, flags);
+}
+
+/**
+ * Writes its settings to an incoming repr object, if any.
+ */
+Inkscape::XML::Node *
+SPTag::write(Inkscape::XML::Document *doc, Inkscape::XML::Node *repr, guint flags)
+{
+ if ((flags & SP_OBJECT_WRITE_BUILD) && !repr) {
+ repr = doc->createElement("inkscape:tag");
+ }
+
+ // Inkscape-only object, not copied during an "plain SVG" dump:
+ if (flags & SP_OBJECT_WRITE_EXT) {
+ if (_expanded) {
+ repr->setAttribute("inkscape:expanded", "true");
+ } else {
+ repr->setAttribute("inkscape:expanded", NULL);
+ }
+ }
+ SPObject::write(doc, repr, flags);
+ return repr;
+}
+
+
+/*
+ Local Variables:
+ mode:c++
+ c-file-style:"stroustrup"
+ c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
+ indent-tabs-mode:nil
+ fill-column:99
+ End:
+*/
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :
diff --git a/src/sp-tag.h b/src/sp-tag.h
new file mode 100644
index 000000000..927bb45d1
--- /dev/null
+++ b/src/sp-tag.h
@@ -0,0 +1,57 @@
+#ifndef SP_TAG_H_SEEN
+#define SP_TAG_H_SEEN
+
+/** \file
+ * SVG <inkscape:tag> implementation
+ *
+ * Authors:
+ * Theodore Janeczko
+ *
+ * Copyright (C) Theodore Janeczko 2012 <flutterguy317@gmail.com>
+ *
+ * Released under GNU GPL, read the file 'COPYING' for more information
+ */
+
+#include "sp-object.h"
+
+/* Skeleton base class */
+
+#define SP_TAG(o) (dynamic_cast<SPTag*>(o))
+#define SP_IS_TAG(o) (dynamic_cast<SPTag*>(o) != NULL)
+
+class SPTag;
+
+class SPTag : public SPObject {
+public:
+ SPTag() {}
+ virtual ~SPTag() {}
+
+ virtual void build(SPDocument * doc, Inkscape::XML::Node *repr);
+ //virtual void release();
+ virtual void set(unsigned key, const gchar* value);
+ virtual void update(SPCtx * ctx, unsigned flags);
+
+ virtual Inkscape::XML::Node* write(Inkscape::XML::Document* doc, Inkscape::XML::Node* repr, guint flags);
+
+ bool expanded() const { return _expanded; }
+ void setExpanded(bool isexpanded);
+
+ void moveTo(SPObject *target, gboolean intoafter);
+
+private:
+ bool _expanded;
+};
+
+
+#endif /* !SP_SKELETON_H_SEEN */
+
+/*
+ Local Variables:
+ mode:c++
+ c-file-style:"stroustrup"
+ c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
+ indent-tabs-mode:nil
+ fill-column:99
+ End:
+*/
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :
diff --git a/src/sp-text.cpp b/src/sp-text.cpp
index 616a1b753..93d81e47b 100644
--- a/src/sp-text.cpp
+++ b/src/sp-text.cpp
@@ -81,6 +81,10 @@ void SPText::build(SPDocument *doc, Inkscape::XML::Node *repr) {
this->readAttr( "dy" );
this->readAttr( "rotate" );
+ // SVG 2 Auto wrapped text
+ this->readAttr( "width" );
+ this->readAttr( "height" );
+
SPItem::build(doc, repr);
this->readAttr( "sodipodi:linespacing" ); // has to happen after the styles are read
@@ -91,6 +95,8 @@ void SPText::release() {
}
void SPText::set(unsigned int key, const gchar* value) {
+ //std::cout << "SPText::set: " << sp_attribute_name( key ) << ": " << (value?value:"Null") << std::endl;
+
if (this->attributes.readSingleAttribute(key, value)) {
this->requestDisplayUpdate(SP_OBJECT_MODIFIED_FLAG);
} else {
@@ -108,6 +114,22 @@ void SPText::set(unsigned int key, const gchar* value) {
this->requestDisplayUpdate(SP_OBJECT_MODIFIED_FLAG | SP_TEXT_LAYOUT_MODIFIED_FLAG);
break;
+ case SP_ATTR_WIDTH:
+ if (!this->width.read(value) || this->width.value < 0.0) {
+ this->width.unset();
+ }
+
+ this->requestDisplayUpdate(SP_OBJECT_MODIFIED_FLAG);
+ break;
+
+ case SP_ATTR_HEIGHT:
+ if (!this->height.read(value) || this->height.value < 0.0) {
+ this->height.unset();
+ }
+
+ this->requestDisplayUpdate(SP_OBJECT_MODIFIED_FLAG);
+ break;
+
default:
SPItem::set(key, value);
break;
@@ -283,6 +305,14 @@ Inkscape::XML::Node *SPText::write(Inkscape::XML::Document *xml_doc, Inkscape::X
this->getRepr()->setAttribute("sodipodi:linespacing", NULL);
}
+ // SVG 2 Auto-wrapped text
+ if( this->width.computed > 0.0 ) {
+ sp_repr_set_svg_double(repr, "width", this->width.computed);
+ }
+ if( this->height.computed > 0.0 ) {
+ sp_repr_set_svg_double(repr, "height", this->height.computed);
+ }
+
SPItem::write(xml_doc, repr, flags);
return repr;
diff --git a/src/sp-text.h b/src/sp-text.h
index 5f0485083..be48d7fcb 100644
--- a/src/sp-text.h
+++ b/src/sp-text.h
@@ -1,5 +1,5 @@
-#ifndef __SP_TEXT_H__
-#define __SP_TEXT_H__
+#ifndef SEEN_SP_TEXT_H
+#define SEEN_SP_TEXT_H
/*
* SVG <text> and <tspan> implementation
@@ -13,13 +13,13 @@
* Released under GNU GPL, read the file 'COPYING' for more information
*/
-#include <glib.h>
-#include <stddef.h>
+#include <cstddef>
#include <sigc++/sigc++.h>
-#include "sp-string.h" // Provides many other headers with SP_IS_STRING
+
+#include "libnrtype/Layout-TNG.h"
#include "sp-item.h"
+#include "sp-string.h" // Provides many other headers with SP_IS_STRING
#include "text-tag-attributes.h"
-#include "libnrtype/Layout-TNG.h"
#define SP_TEXT(obj) (dynamic_cast<SPText*>((SPObject*)obj))
#define SP_IS_TEXT(obj) (dynamic_cast<const SPText*>((SPObject*)obj) != NULL)
@@ -45,7 +45,11 @@ public:
//semiprivate: (need to be accessed by the C-style functions still)
TextTagAttributes attributes;
Inkscape::Text::Layout layout;
-
+
+ // SVG 2 Auto-wrapped text
+ SVGLength width;
+ SVGLength height;
+
/** when the object is transformed it's nicer to change the font size
and coordinates when we can, rather than just applying a matrix
transform. is_root is used to indicate to the function that it should
@@ -77,15 +81,15 @@ public:
virtual void release();
virtual void child_added(Inkscape::XML::Node* child, Inkscape::XML::Node* ref);
virtual void remove_child(Inkscape::XML::Node* child);
- virtual void set(unsigned int key, const gchar* value);
+ virtual void set(unsigned int key, const char* value);
virtual void update(SPCtx* ctx, unsigned int flags);
virtual void modified(unsigned int flags);
- virtual Inkscape::XML::Node* write(Inkscape::XML::Document* doc, Inkscape::XML::Node* repr, guint flags);
+ virtual Inkscape::XML::Node* write(Inkscape::XML::Document* doc, Inkscape::XML::Node* repr, unsigned int flags);
virtual Geom::OptRect bbox(Geom::Affine const &transform, SPItem::BBoxType type) const;
virtual void print(SPPrintContext *ctx);
virtual const char* displayName() const;
- virtual gchar* description() const;
+ virtual char* description() const;
virtual Inkscape::DrawingItem* show(Inkscape::Drawing &drawing, unsigned int key, unsigned int flags);
virtual void hide(unsigned int key);
virtual void snappoints(std::vector<Inkscape::SnapCandidatePoint> &p, Inkscape::SnapPreferences const *snapprefs) const;
diff --git a/src/sp-textpath.h b/src/sp-textpath.h
index 075743d8e..4457cb8cf 100644
--- a/src/sp-textpath.h
+++ b/src/sp-textpath.h
@@ -1,14 +1,13 @@
#ifndef INKSCAPE_SP_TEXTPATH_H
#define INKSCAPE_SP_TEXTPATH_H
-#include <glib.h>
#include "svg/svg-length.h"
#include "sp-item.h"
#include "sp-text.h"
+
class SPUsePath;
class Path;
-
#define SP_TEXTPATH(obj) (dynamic_cast<SPTextPath*>((SPObject*)obj))
#define SP_IS_TEXTPATH(obj) (dynamic_cast<const SPTextPath*>((SPObject*)obj) != NULL)
@@ -26,10 +25,10 @@ public:
virtual void build(SPDocument* doc, Inkscape::XML::Node* repr);
virtual void release();
- virtual void set(unsigned int key, const gchar* value);
+ virtual void set(unsigned int key, const char* value);
virtual void update(SPCtx* ctx, unsigned int flags);
virtual void modified(unsigned int flags);
- virtual Inkscape::XML::Node* write(Inkscape::XML::Document* doc, Inkscape::XML::Node* repr, guint flags);
+ virtual Inkscape::XML::Node* write(Inkscape::XML::Document* doc, Inkscape::XML::Node* repr, unsigned int flags);
};
#define SP_IS_TEXT_TEXTPATH(obj) (SP_IS_TEXT(obj) && obj->firstChild() && SP_IS_TEXTPATH(obj->firstChild()))
diff --git a/src/sp-title.h b/src/sp-title.h
index 14faf4b0a..04f3829c6 100644
--- a/src/sp-title.h
+++ b/src/sp-title.h
@@ -1,5 +1,5 @@
-#ifndef __SP_TITLE_H__
-#define __SP_TITLE_H__
+#ifndef SEEN_SP_TITLE_H
+#define SEEN_SP_TITLE_H
/*
* SVG <title> implementation
@@ -22,7 +22,7 @@ public:
SPTitle();
virtual ~SPTitle();
- virtual Inkscape::XML::Node* write(Inkscape::XML::Document *xml_doc, Inkscape::XML::Node *repr, guint flags);
+ virtual Inkscape::XML::Node* write(Inkscape::XML::Document *xml_doc, Inkscape::XML::Node *repr, unsigned int flags);
};
#endif
diff --git a/src/sp-tref-reference.h b/src/sp-tref-reference.h
index 10cc25121..b555ace2d 100644
--- a/src/sp-tref-reference.h
+++ b/src/sp-tref-reference.h
@@ -12,15 +12,17 @@
* Released under GNU GPL, read the file 'COPYING' for more information.
*/
-#include "sp-item.h"
-#include <uri-references.h>
-#include <stddef.h>
+#include <cstddef>
#include <sigc++/sigc++.h>
+#include "sp-item.h"
+#include "uri-references.h"
+
#include "util/share.h"
#include "xml/node-observer.h"
#include "xml/subtree.h"
+typedef unsigned int GQuark;
class SPTRefReference : public Inkscape::URIReference,
public Inkscape::XML::NodeObserver {
diff --git a/src/sp-tref.h b/src/sp-tref.h
index f5aed9ba6..1727620cd 100644
--- a/src/sp-tref.h
+++ b/src/sp-tref.h
@@ -34,7 +34,7 @@ public:
TextTagAttributes attributes;
// Text stored in the xlink:href attribute
- gchar *href;
+ char *href;
// URI reference to original object
SPTRefReference *uriOriginalRef;
@@ -53,14 +53,14 @@ public:
virtual void build(SPDocument* doc, Inkscape::XML::Node* repr);
virtual void release();
- virtual void set(unsigned int key, const gchar* value);
+ virtual void set(unsigned int key, char const* value);
virtual void update(SPCtx* ctx, unsigned int flags);
virtual void modified(unsigned int flags);
virtual Inkscape::XML::Node* write(Inkscape::XML::Document* doc, Inkscape::XML::Node* repr, guint flags);
virtual Geom::OptRect bbox(Geom::Affine const &transform, SPItem::BBoxType type) const;
virtual const char* displayName() const;
- virtual gchar* description() const;
+ virtual char* description() const;
};
void sp_tref_update_text(SPTRef *tref);
diff --git a/src/sp-tspan.h b/src/sp-tspan.h
index 4c23b2eba..1aef4cd0c 100644
--- a/src/sp-tspan.h
+++ b/src/sp-tspan.h
@@ -5,7 +5,6 @@
* tspan and textpath, based on the flowtext routines
*/
-#include <glib.h>
#include "sp-item.h"
#include "text-tag-attributes.h"
@@ -23,15 +22,15 @@ public:
SPTSpan();
virtual ~SPTSpan();
- guint role : 2;
+ unsigned int role : 2;
TextTagAttributes attributes;
virtual void build(SPDocument* doc, Inkscape::XML::Node* repr);
virtual void release();
- virtual void set(unsigned int key, const gchar* value);
+ virtual void set(unsigned int key, const char* value);
virtual void update(SPCtx* ctx, unsigned int flags);
virtual void modified(unsigned int flags);
- virtual Inkscape::XML::Node* write(Inkscape::XML::Document* doc, Inkscape::XML::Node* repr, guint flags);
+ virtual Inkscape::XML::Node* write(Inkscape::XML::Document* doc, Inkscape::XML::Node* repr, unsigned int flags);
virtual Geom::OptRect bbox(Geom::Affine const &transform, SPItem::BBoxType type) const;
virtual const char* displayName() const;
diff --git a/src/sp-use-reference.h b/src/sp-use-reference.h
index d99b425f1..297bdc26c 100644
--- a/src/sp-use-reference.h
+++ b/src/sp-use-reference.h
@@ -9,11 +9,11 @@
* Released under GNU GPL, read the file 'COPYING' for more information.
*/
-#include "sp-item.h"
-#include <uri-references.h>
-#include <stddef.h>
#include <sigc++/sigc++.h>
+#include "sp-item.h"
+#include "uri-references.h"
+
class Path;
namespace Inkscape {
@@ -43,7 +43,7 @@ public:
bool sourceDirty;
SPObject *owner;
- gchar *sourceHref;
+ char *sourceHref;
Inkscape::XML::Node *sourceRepr;
SPObject *sourceObject;
diff --git a/src/sp-use.h b/src/sp-use.h
index 215eb44d7..97385b986 100644
--- a/src/sp-use.h
+++ b/src/sp-use.h
@@ -1,5 +1,5 @@
-#ifndef __SP_USE_H__
-#define __SP_USE_H__
+#ifndef SEEN_SP_USE_H
+#define SEEN_SP_USE_H
/*
* SVG <use> implementation
@@ -13,8 +13,9 @@
* Released under GNU GPL, read the file 'COPYING' for more information
*/
-#include <stddef.h>
+#include <cstddef>
#include <sigc++/sigc++.h>
+
#include "svg/svg-length.h"
#include "sp-item.h"
#include "enums.h"
@@ -38,7 +39,7 @@ public:
SVGLength y;
SVGLength width;
SVGLength height;
- gchar *href;
+ char *href;
// the reference to the original object
SPUseReference *ref;
@@ -52,14 +53,14 @@ public:
virtual void build(SPDocument* doc, Inkscape::XML::Node* repr);
virtual void release();
- virtual void set(unsigned key, gchar const *value);
- virtual Inkscape::XML::Node* write(Inkscape::XML::Document *xml_doc, Inkscape::XML::Node *repr, guint flags);
+ virtual void set(unsigned key, char const *value);
+ virtual Inkscape::XML::Node* write(Inkscape::XML::Document *xml_doc, Inkscape::XML::Node *repr, unsigned int flags);
virtual void update(SPCtx* ctx, unsigned int flags);
virtual void modified(unsigned int flags);
virtual Geom::OptRect bbox(Geom::Affine const &transform, SPItem::BBoxType bboxtype) const;
virtual const char* displayName() const;
- virtual gchar* description() const;
+ virtual char* description() const;
virtual void print(SPPrintContext *ctx);
virtual Inkscape::DrawingItem* show(Inkscape::Drawing &drawing, unsigned int key, unsigned int flags);
virtual void hide(unsigned int key);
diff --git a/src/splivarot.cpp b/src/splivarot.cpp
index 8bb2a7150..1a75a6f29 100644
--- a/src/splivarot.cpp
+++ b/src/splivarot.cpp
@@ -25,7 +25,7 @@
#include "sp-path.h"
#include "sp-shape.h"
#include "sp-image.h"
-#include "marker.h"
+#include "sp-marker.h"
#include "enums.h"
#include "sp-text.h"
#include "sp-flowtext.h"
diff --git a/src/splivarot.h b/src/splivarot.h
index 329fc65d2..ba314399f 100644
--- a/src/splivarot.h
+++ b/src/splivarot.h
@@ -1,5 +1,5 @@
-#ifndef __SP_LIVAROT_H__
-#define __SP_LIVAROT_H__
+#ifndef SEEN_SP_LIVAROT_H
+#define SEEN_SP_LIVAROT_H
/*
* boolops and outlines
@@ -7,9 +7,10 @@
* public domain
*/
-#include "livarot/Path.h"
#include <2geom/forward.h>
#include <2geom/path.h>
+#include "livarot/Path.h"
+
class SPCurve;
class SPDesktop;
class SPItem;
diff --git a/src/streq.h b/src/streq.h
index a3524a941..7edc5cfe9 100644
--- a/src/streq.h
+++ b/src/streq.h
@@ -2,7 +2,6 @@
#define INKSCAPE_STREQ_H
#include <cstring>
-#include <string>
/** Convenience/readability wrapper for strcmp(a,b)==0. */
inline bool
diff --git a/src/style-enums.h b/src/style-enums.h
index 024943458..f52752018 100644
--- a/src/style-enums.h
+++ b/src/style-enums.h
@@ -17,7 +17,7 @@
/* SPFontStyle */
-#include "display/canvas-bpath.h"
+#include "display/canvas-bpath.h" // FIXME those enums belong here!
enum SPCSSFontSize {
SP_CSS_FONT_SIZE_XX_SMALL,
@@ -227,8 +227,8 @@ enum SPTextRendering {
struct SPStyleEnum {
- gchar const *key;
- gint value;
+ char const *key;
+ int value;
};
static SPStyleEnum const enum_fill_rule[] = {
diff --git a/src/style-internal.h b/src/style-internal.h
index 039b0bbe3..32792827a 100644
--- a/src/style-internal.h
+++ b/src/style-internal.h
@@ -516,7 +516,7 @@ public:
{}
// TODO probably want to avoid gchar* and c-style strings.
- SPIString( Glib::ustring const &name, gchar* value_default_in = NULL )
+ SPIString( Glib::ustring const &name, gchar const* value_default_in = NULL )
: SPIBase( name ),
value(NULL),
value_default(value_default_in ? g_strdup(value_default_in) : NULL)
diff --git a/src/style.cpp b/src/style.cpp
index 364dd2c21..e0c8536fc 100644
--- a/src/style.cpp
+++ b/src/style.cpp
@@ -191,7 +191,6 @@ SPStyle::SPStyle(SPDocument *document_in, SPObject *object_in) :
image_rendering( "image-rendering", enum_image_rendering, SP_CSS_IMAGE_RENDERING_AUTO),
shape_rendering( "shape-rendering", enum_shape_rendering, SP_CSS_SHAPE_RENDERING_AUTO),
text_rendering( "text-rendering", enum_text_rendering, SP_CSS_TEXT_RENDERING_AUTO )
-
{
// std::cout << "SPStyle::SPStyle( SPDocument ): Entrance: (" << _count << ")" << std::endl;
// std::cout << " Document: " << (document_in?"present":"null") << std::endl;
diff --git a/src/style.h b/src/style.h
index 98d25d24c..a4c2b3043 100644
--- a/src/style.h
+++ b/src/style.h
@@ -20,11 +20,9 @@
#include "style-enums.h"
#include "style-internal.h"
-#include <stddef.h>
#include <sigc++/connection.h>
#include <iostream>
#include <vector>
-// #include <map>
// Define SPIBasePtr, a Pointer to a data member of SPStyle of type SPIBase;
typedef SPIBase SPStyle::*SPIBasePtr;
@@ -40,9 +38,6 @@ class Node;
#include "libcroco/cr-declaration.h"
#include "libcroco/cr-prop-list.h"
-//struct CRDeclaration;
-//struct CRPropList;
-
/// An SVG style object.
class SPStyle {
@@ -55,8 +50,8 @@ public:
void read(SPObject *object, Inkscape::XML::Node *repr);
void readFromObject(SPObject *object);
void readFromPrefs(Glib::ustring const &path);
- void readIfUnset( gint id, gchar const *val );
- Glib::ustring write( guint const flags, SPStyle const *const base = NULL ) const;
+ void readIfUnset( int id, char const *val );
+ Glib::ustring write( unsigned int const flags, SPStyle const *const base = NULL ) const;
void cascade( SPStyle const *const parent );
void merge( SPStyle const *const parent );
bool operator==(const SPStyle& rhs);
@@ -66,7 +61,7 @@ public:
//FIXME: Make private
public:
- void _mergeString( gchar const *const p ); // Rename to readFromString?
+ void _mergeString( char const *const p ); // Rename to readFromString?
private:
void _mergeDeclList( CRDeclaration const *const decl_list );
void _mergeDecl( CRDeclaration const *const decl );
@@ -276,15 +271,15 @@ public:
SPObject *getFilter() { return (filter.href) ? filter.href->getObject() : NULL; }
SPObject const *getFilter() const { return (filter.href) ? filter.href->getObject() : NULL; }
- gchar const *getFilterURI() const { return (filter.href) ? filter.href->getURI()->toString() : NULL; }
+ char const *getFilterURI() const { return (filter.href) ? filter.href->getURI()->toString() : NULL; }
SPPaintServer *getFillPaintServer() { return (fill.value.href) ? fill.value.href->getObject() : NULL; }
SPPaintServer const *getFillPaintServer() const { return (fill.value.href) ? fill.value.href->getObject() : NULL; }
- gchar const *getFillURI() const { return (fill.value.href) ? fill.value.href->getURI()->toString() : NULL; }
+ char const *getFillURI() const { return (fill.value.href) ? fill.value.href->getURI()->toString() : NULL; }
SPPaintServer *getStrokePaintServer() { return (stroke.value.href) ? stroke.value.href->getObject() : NULL; }
SPPaintServer const *getStrokePaintServer() const { return (stroke.value.href) ? stroke.value.href->getObject() : NULL; }
- gchar const *getStrokeURI() const { return (stroke.value.href) ? stroke.value.href->getURI()->toString() : NULL; }
+ char const *getStrokeURI() const { return (stroke.value.href) ? stroke.value.href->getURI()->toString() : NULL; }
};
SPStyle *sp_style_new(SPDocument *document); // SPStyle::SPStyle( SPDocument *document = NULL );
@@ -299,39 +294,39 @@ void sp_style_read_from_object(SPStyle *style, SPObject *object); //SPStyle::rea
void sp_style_read_from_prefs(SPStyle *style, Glib::ustring const &path); // SPStyle::read( ... );
-void sp_style_merge_from_style_string(SPStyle *style, gchar const *p); // SPStyle::merge( ... );?
+void sp_style_merge_from_style_string(SPStyle *style, char const *p); // SPStyle::merge( ... );?
void sp_style_merge_from_parent(SPStyle *style, SPStyle const *parent); // SPStyle::cascade( ... );
void sp_style_merge_from_dying_parent(SPStyle *style, SPStyle const *parent); // SPStyle::merge( ... )
-gchar *sp_style_write_string(SPStyle const *style, guint flags = SP_STYLE_FLAG_IFSET);//SPStyle::write
+char *sp_style_write_string(SPStyle const *style, unsigned int flags = SP_STYLE_FLAG_IFSET);//SPStyle::write
-gchar *sp_style_write_difference(SPStyle const *from, SPStyle const *to); // SPStyle::write
+char *sp_style_write_difference(SPStyle const *from, SPStyle const *to); // SPStyle::write
-void sp_style_set_to_uri_string (SPStyle *style, bool isfill, const gchar *uri); // ?
+void sp_style_set_to_uri_string (SPStyle *style, bool isfill, const char *uri); // ?
-gchar const *sp_style_get_css_unit_string(int unit); // No change?
+char const *sp_style_get_css_unit_string(int unit); // No change?
double sp_style_css_size_px_to_units(double size, int unit); // No change?
double sp_style_css_size_units_to_px(double size, int unit); // No change?
-SPCSSAttr *sp_css_attr_from_style (SPStyle const *const style, guint flags);
-SPCSSAttr *sp_css_attr_from_object(SPObject *object, guint flags = SP_STYLE_FLAG_IFSET);
+SPCSSAttr *sp_css_attr_from_style (SPStyle const *const style, unsigned int flags);
+SPCSSAttr *sp_css_attr_from_object(SPObject *object, unsigned int flags = SP_STYLE_FLAG_IFSET);
SPCSSAttr *sp_css_attr_unset_text(SPCSSAttr *css);
SPCSSAttr *sp_css_attr_unset_uris(SPCSSAttr *css);
SPCSSAttr *sp_css_attr_scale(SPCSSAttr *css, double ex);
void sp_style_unset_property_attrs(SPObject *o);
-void sp_style_set_property_url (SPObject *item, gchar const *property, SPObject *linked, bool recursive);
+void sp_style_set_property_url (SPObject *item, char const *property, SPObject *linked, bool recursive);
void css_quote( Glib::ustring &val ); // Add quotes around CSS values
void css_unquote( Glib::ustring &val ); // Remove quotes from CSS values (style-internal.cpp, xml/repr-css.cpp)
void css_font_family_quote( Glib::ustring &val ); // style-internal.cpp, text-toolbar.cpp
void css_font_family_unquote( Glib::ustring &val ); // style-internal.cpp, text-toolbar.cpp
-Glib::ustring css2_escape_quote(gchar const *val);
+Glib::ustring css2_escape_quote(char const *val);
#endif // SEEN_SP_STYLE_H
diff --git a/src/svg-view-widget.cpp b/src/svg-view-widget.cpp
index 567156fec..c568d3ca7 100644
--- a/src/svg-view-widget.cpp
+++ b/src/svg-view-widget.cpp
@@ -14,7 +14,6 @@
* Released under GNU GPL, read the file 'COPYING' for more information
*/
-#include <gtk/gtk.h>
#include "display/sp-canvas.h"
#include "display/sp-canvas-group.h"
#include "display/canvas-arena.h"
@@ -23,8 +22,6 @@
#include "svg-view-widget.h"
#include "util/units.h"
-static void sp_svg_view_widget_class_init (SPSVGSPViewWidgetClass *klass);
-static void sp_svg_view_widget_init (SPSVGSPViewWidget *widget);
static void sp_svg_view_widget_dispose(GObject *object);
static void sp_svg_view_widget_size_allocate (GtkWidget *widget, GtkAllocation *allocation);
@@ -42,28 +39,7 @@ static void sp_svg_view_widget_get_preferred_height(GtkWidget *widget,
static void sp_svg_view_widget_view_resized (SPViewWidget *vw, Inkscape::UI::View::View *view, gdouble width, gdouble height);
-static SPViewWidgetClass *widget_parent_class;
-
-GType sp_svg_view_widget_get_type(void)
-{
- static GType type = 0;
- if (!type) {
- GTypeInfo info = {
- sizeof(SPSVGSPViewWidgetClass),
- 0, // base_init
- 0, // base_finalize
- (GClassInitFunc)sp_svg_view_widget_class_init,
- 0, // class_finalize
- 0, // class_data
- sizeof(SPSVGSPViewWidget),
- 0, // n_preallocs
- (GInstanceInitFunc)sp_svg_view_widget_init,
- 0 // value_table
- };
- type = g_type_register_static(SP_TYPE_VIEW_WIDGET, "SPSVGSPViewWidget", &info, static_cast<GTypeFlags>(0));
- }
- return type;
-}
+G_DEFINE_TYPE(SPSVGSPViewWidget, sp_svg_view_widget, SP_TYPE_VIEW_WIDGET);
/**
* Callback to initialize SPSVGSPViewWidget vtable.
@@ -74,8 +50,6 @@ static void sp_svg_view_widget_class_init(SPSVGSPViewWidgetClass *klass)
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
SPViewWidgetClass *vw_class = SP_VIEW_WIDGET_CLASS (klass);
- widget_parent_class = static_cast<SPViewWidgetClass *>(g_type_class_peek_parent (klass));
-
object_class->dispose = sp_svg_view_widget_dispose;
widget_class->size_allocate = sp_svg_view_widget_size_allocate;
@@ -94,7 +68,6 @@ static void sp_svg_view_widget_class_init(SPSVGSPViewWidgetClass *klass)
*/
static void sp_svg_view_widget_init(SPSVGSPViewWidget *vw)
{
- GtkStyle *style;
SPCanvasItem *parent;
/* Settings */
@@ -117,14 +90,22 @@ static void sp_svg_view_widget_init(SPSVGSPViewWidget *vw)
vw->canvas = SPCanvas::createAA();
-#if !GTK_CHECK_VERSION(3,0,0)
+#if GTK_CHECK_VERSION(3,0,0)
+ GdkRGBA white = {1,1,1,0};
+ gtk_widget_override_background_color(vw->canvas, GTK_STATE_FLAG_NORMAL, &white);
+#else
gtk_widget_pop_colormap ();
-#endif
-
- style = gtk_style_copy (gtk_widget_get_style (vw->canvas));
+ GtkStyle *style = gtk_style_copy (gtk_widget_get_style (vw->canvas));
style->bg[GTK_STATE_NORMAL] = style->white;
gtk_widget_set_style (vw->canvas, style);
+#endif
+
+#if GTK_CHECK_VERSION(3,8,0)
+ gtk_container_add (GTK_CONTAINER (vw->sw), vw->canvas);
+#else
gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (vw->sw), vw->canvas);
+#endif
+
gtk_widget_show (vw->canvas);
/* View */
@@ -142,8 +123,8 @@ static void sp_svg_view_widget_dispose(GObject *object)
vw->canvas = NULL;
- if (((GObjectClass *) (widget_parent_class))->dispose) {
- (* ((GObjectClass *) (widget_parent_class))->dispose) (object);
+ if (G_OBJECT_CLASS(sp_svg_view_widget_parent_class)->dispose) {
+ G_OBJECT_CLASS(sp_svg_view_widget_parent_class)->dispose(object);
}
}
@@ -156,17 +137,18 @@ static void sp_svg_view_widget_size_request(GtkWidget *widget, GtkRequisition *r
Inkscape::UI::View::View *v = SP_VIEW_WIDGET_VIEW (widget);
#if GTK_CHECK_VERSION(3,0,0)
- if (((GtkWidgetClass *) (widget_parent_class))->get_preferred_width && ((GtkWidgetClass *) (widget_parent_class))->get_preferred_width) {
+ if (GTK_WIDGET_CLASS(sp_svg_view_widget_parent_class)->get_preferred_width &&
+ GTK_WIDGET_CLASS(sp_svg_view_widget_parent_class)->get_preferred_height) {
gint width_min, height_min, width_nat, height_nat;
- (* ((GtkWidgetClass *) (widget_parent_class))->get_preferred_width) (widget, &width_min, &width_nat);
- (* ((GtkWidgetClass *) (widget_parent_class))->get_preferred_height) (widget, &height_min, &height_nat);
+ GTK_WIDGET_CLASS(sp_svg_view_widget_parent_class)->get_preferred_width(widget, &width_min, &width_nat);
+ GTK_WIDGET_CLASS(sp_svg_view_widget_parent_class)->get_preferred_height(widget, &height_min, &height_nat);
req->width=width_min;
req->height=height_min;
}
#else
- if (((GtkWidgetClass *) (widget_parent_class))->size_request) {
- (* ((GtkWidgetClass *) (widget_parent_class))->size_request) (widget, req);
+ if (GTK_WIDGET_CLASS(sp_svg_view_widget_parent_class)->size_request) {
+ GTK_WIDGET_CLASS(sp_svg_view_widget_parent_class)->size_request(widget, req);
}
#endif
@@ -220,8 +202,8 @@ static void sp_svg_view_widget_size_allocate(GtkWidget *widget, GtkAllocation *a
{
SPSVGSPViewWidget *svgvw = SP_SVG_VIEW_WIDGET (widget);
- if (((GtkWidgetClass *) (widget_parent_class))->size_allocate) {
- (* ((GtkWidgetClass *) (widget_parent_class))->size_allocate) (widget, allocation);
+ if (GTK_WIDGET_CLASS(sp_svg_view_widget_parent_class)->size_allocate) {
+ GTK_WIDGET_CLASS(sp_svg_view_widget_parent_class)->size_allocate(widget, allocation);
}
if (!svgvw->resize) {
diff --git a/src/svg-view-widget.h b/src/svg-view-widget.h
index eab5be75b..34c70f396 100644
--- a/src/svg-view-widget.h
+++ b/src/svg-view-widget.h
@@ -44,7 +44,7 @@ public:
/// Whether to resize automatically
bool resize;
- gdouble maxwidth, maxheight;
+ double maxwidth, maxheight;
// C++ Wrappers
diff --git a/src/svg-view.h b/src/svg-view.h
index 89f38ad34..bd6fd683a 100644
--- a/src/svg-view.h
+++ b/src/svg-view.h
@@ -16,7 +16,6 @@
struct SPCanvasGroup;
struct SPCanvasItem;
-
/**
* Generic SVG view.
*/
@@ -25,12 +24,12 @@ public:
unsigned int _dkey;
SPCanvasGroup *_parent;
SPCanvasItem *_drawing;
- gdouble _hscale; ///< horizontal scale
- gdouble _vscale; ///< vertical scale
+ double _hscale; ///< horizontal scale
+ double _vscale; ///< vertical scale
bool _rescale; ///< whether to rescale automatically
bool _keepaspect;
- gdouble _width;
- gdouble _height;
+ double _width;
+ double _height;
/**
@@ -43,12 +42,12 @@ public:
/**
* Rescales SPSVGView to given proportions.
*/
- void setScale(gdouble hscale, gdouble vscale);
+ void setScale(double hscale, double vscale);
/**
* Rescales SPSVGView and keeps aspect ratio.
*/
- void setRescale(bool rescale, bool keepaspect, gdouble width, gdouble height);
+ void setRescale(bool rescale, bool keepaspect, double width, double height);
/**
* Helper function that sets rescale ratio and emits resize event.
diff --git a/src/svg/css-ostringstream.h b/src/svg/css-ostringstream.h
index 8cedb0979..2c66dff16 100644
--- a/src/svg/css-ostringstream.h
+++ b/src/svg/css-ostringstream.h
@@ -1,7 +1,6 @@
#ifndef SVG_CSS_OSTRINGSTREAM_H_INKSCAPE
#define SVG_CSS_OSTRINGSTREAM_H_INKSCAPE
-#include <glib.h>
#include <sstream>
namespace Inkscape {
@@ -42,8 +41,8 @@ public:
#undef INK_CSS_STR_OP
- gchar const *gcharp() const {
- return reinterpret_cast<gchar const *>(ostr.str().c_str());
+ char const *gcharp() const {
+ return ostr.str().c_str();
}
std::string str() const {
diff --git a/src/svg/path-string.h b/src/svg/path-string.h
index 3a891873d..6c7e23017 100644
--- a/src/svg/path-string.h
+++ b/src/svg/path-string.h
@@ -15,10 +15,10 @@
#ifndef SEEN_INKSCAPE_SVG_PATH_STRING_H
#define SEEN_INKSCAPE_SVG_PATH_STRING_H
+#include <2geom/point.h>
+#include <cstdio>
#include <glibmm/ustring.h>
#include <string>
-#include <stdio.h>
-#include <2geom/point.h>
namespace Inkscape {
diff --git a/src/svg/stringstream.h b/src/svg/stringstream.h
index d143abee8..c9cfdd601 100644
--- a/src/svg/stringstream.h
+++ b/src/svg/stringstream.h
@@ -1,7 +1,6 @@
#ifndef INKSCAPE_STRINGSTREAM_H
#define INKSCAPE_STRINGSTREAM_H
-#include <glib.h>
#include <sstream>
#include <string>
@@ -41,8 +40,8 @@ public:
#undef INK_SVG_STR_OP
- gchar const *gcharp() const {
- return reinterpret_cast<gchar const *>(ostr.str().c_str());
+ char const *gcharp() const {
+ return ostr.str().c_str();
}
std::string str() const {
diff --git a/src/svg/svg-color.h b/src/svg/svg-color.h
index b8e317e3b..ea0896872 100644
--- a/src/svg/svg-color.h
+++ b/src/svg/svg-color.h
@@ -1,16 +1,15 @@
#ifndef SVG_SVG_COLOR_H_SEEN
#define SVG_SVG_COLOR_H_SEEN
-#include <glib.h>
-
+typedef unsigned int guint32;
struct SVGICCColor;
-guint32 sp_svg_read_color(gchar const *str, unsigned int dfl);
-guint32 sp_svg_read_color(gchar const *str, gchar const **end_ptr, guint32 def);
+guint32 sp_svg_read_color(char const *str, unsigned int dfl);
+guint32 sp_svg_read_color(char const *str, char const **end_ptr, guint32 def);
void sp_svg_write_color(char *buf, unsigned int buflen, unsigned int rgba32);
-bool sp_svg_read_icc_color( gchar const *str, gchar const **end_ptr, SVGICCColor* dest );
-bool sp_svg_read_icc_color( gchar const *str, SVGICCColor* dest );
-void icc_color_to_sRGB(SVGICCColor* dest, guchar* r, guchar* g, guchar* b);
+bool sp_svg_read_icc_color( char const *str, char const **end_ptr, SVGICCColor* dest );
+bool sp_svg_read_icc_color( char const *str, SVGICCColor* dest );
+void icc_color_to_sRGB(SVGICCColor* dest, unsigned char* r, unsigned char* g, unsigned char* b);
#endif /* !SVG_SVG_COLOR_H_SEEN */
diff --git a/src/svg/svg-length.cpp b/src/svg/svg-length.cpp
index b9e8e6340..b9b475f4b 100644
--- a/src/svg/svg-length.cpp
+++ b/src/svg/svg-length.cpp
@@ -1,6 +1,4 @@
-#define __SP_SVG_LENGTH_C__
-
-/*
+/**
* SVG data parser
*
* Authors:
@@ -12,20 +10,15 @@
* This code is in public domain
*/
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif
-
+#include <cmath>
#include <cstring>
#include <string>
-#include <math.h>
#include <glib.h>
#include "svg.h"
#include "stringstream.h"
#include "util/units.h"
-
static unsigned sp_svg_length_read_lff(gchar const *str, SVGLength::Unit *unit, float *val, float *computed, char **next);
#ifndef MAX
@@ -570,4 +563,4 @@ void SVGLength::readOrUnset(gchar const *str, Unit u, float v, float c)
fill-column:99
End:
*/
-// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8 :
diff --git a/src/svg/svg-length.h b/src/svg/svg-length.h
index 477b3ef81..c34905d07 100644
--- a/src/svg/svg-length.h
+++ b/src/svg/svg-length.h
@@ -1,11 +1,4 @@
-#ifndef SEEN_SP_SVG_LENGTH_H
-#define SEEN_SP_SVG_LENGTH_H
-
/**
- * \file src/svg/svg-length.h
- * \brief SVG length type
- */
-/*
* Authors:
* Lauris Kaplinski <lauris@kaplinski.com>
* Carl Hetherington <inkscape@carlh.net>
@@ -16,10 +9,13 @@
* Released under GNU GPL, read the file 'COPYING' for more information
*/
-#include <glib.h>
+#ifndef SEEN_SP_SVG_LENGTH_H
+#define SEEN_SP_SVG_LENGTH_H
-class SVGLength
-{
+/**
+ * SVG length type
+ */
+class SVGLength {
public:
SVGLength();
@@ -57,9 +53,9 @@ public:
return v;
}
- bool read(gchar const *str);
- void readOrUnset(gchar const *str, Unit u = NONE, float v = 0, float c = 0);
- bool readAbsolute(gchar const *str);
+ bool read(char const *str);
+ void readOrUnset(char const *str, Unit u = NONE, float v = 0, float c = 0);
+ bool readAbsolute(char const *str);
void set(Unit u, float v, float c);
void unset(Unit u = NONE, float v = 0, float c = 0);
void update(double em, double ex, double scale);
@@ -76,4 +72,4 @@ public:
fill-column:99
End:
*/
-// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8 :
diff --git a/src/svg/svg-path.cpp b/src/svg/svg-path.cpp
index 59dad9ead..9ba3c0ebd 100644
--- a/src/svg/svg-path.cpp
+++ b/src/svg/svg-path.cpp
@@ -1,41 +1,25 @@
-#define __SP_SVG_PARSE_C__
/*
- svg-path.c: Parse SVG path element data into bezier path.
-
- Copyright (C) 2000 Eazel, Inc.
- Copyright (C) 2000 Lauris Kaplinski
- Copyright (C) 2001 Ximian, Inc.
- Copyright (C) 2008 Johan Engelen
-
- 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 the Free Software Foundation; either version 2 of the
- License, or (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 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.
-
- Authors:
- Johan Engelen
- (old nartbpath code that has been deleted: Raph Levien <raph@artofcode.com>)
- (old nartbpath code that has been deleted: Lauris Kaplinski <lauris@ximian.com>)
-*/
+ * svg-path.cpp: Parse SVG path element data into bezier path.
+ * Authors:
+ * Johan Engelen
+ * (old nartbpath code that has been deleted: Raph Levien <raph@artofcode.com>)
+ * (old nartbpath code that has been deleted: Lauris Kaplinski <lauris@ximian.com>)
+ *
+ * Copyright (C) 2000 Eazel, Inc.
+ * Copyright (C) 2000 Lauris Kaplinski
+ * Copyright (C) 2001 Ximian, Inc.
+ * Copyright (C) 2008 Johan Engelen
+ *
+ * Copyright (C) 2000-2008 authors
+ *
+ * Released under GNU GPL, read the file 'COPYING' for more information
+ */
#include <cstring>
#include <string>
#include <cassert>
#include <glib.h> // g_assert()
-#include "svg/svg.h"
-#include "svg/path-string.h"
-
#include <2geom/pathvector.h>
#include <2geom/path.h>
#include <2geom/curves.h>
@@ -45,6 +29,9 @@
#include <2geom/exception.h>
#include <2geom/angle.h>
+#include "svg/svg.h"
+#include "svg/path-string.h"
+
/*
* Parses the path in str. When an error is found in the pathstring, this method
* returns a truncated path up to where the error was found in the pathstring.
@@ -150,4 +137,4 @@ gchar * sp_svg_write_path(Geom::Path const &p) {
fill-column:99
End:
*/
-// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8 :
diff --git a/src/svg/svg.h b/src/svg/svg.h
index a7795b82e..6ce9db937 100644
--- a/src/svg/svg.h
+++ b/src/svg/svg.h
@@ -11,7 +11,7 @@
*
* Released under GNU GPL, read the file 'COPYING' for more information
*/
-#include <glib.h>
+
#include <vector>
#include <cstring>
#include <string>
@@ -28,13 +28,13 @@
* Return FALSE and let val untouched on error
*/
-unsigned int sp_svg_number_read_f( const gchar *str, float *val );
-unsigned int sp_svg_number_read_d( const gchar *str, double *val );
+unsigned int sp_svg_number_read_f( const char *str, float *val );
+unsigned int sp_svg_number_read_d( const char *str, double *val );
/*
* No buffer overflow checking is done, so better wrap them if needed
*/
-unsigned int sp_svg_number_write_de( gchar *buf, int bufLen, double val, unsigned int tprec, int min_exp );
+unsigned int sp_svg_number_write_de( char *buf, int bufLen, double val, unsigned int tprec, int min_exp );
/* Length */
@@ -47,24 +47,24 @@ unsigned int sp_svg_number_write_de( gchar *buf, int bufLen, double val, unsigne
* Any return value pointer can be NULL
*/
-unsigned int sp_svg_length_read_computed_absolute( const gchar *str, float *length );
-std::vector<SVGLength> sp_svg_length_list_read( const gchar *str );
-unsigned int sp_svg_length_read_ldd( const gchar *str, SVGLength::Unit *unit, double *value, double *computed );
+unsigned int sp_svg_length_read_computed_absolute( const char *str, float *length );
+std::vector<SVGLength> sp_svg_length_list_read( const char *str );
+unsigned int sp_svg_length_read_ldd( const char *str, SVGLength::Unit *unit, double *value, double *computed );
std::string sp_svg_length_write_with_units(SVGLength const &length);
-bool sp_svg_transform_read(gchar const *str, Geom::Affine *transform);
+bool sp_svg_transform_read(char const *str, Geom::Affine *transform);
-gchar *sp_svg_transform_write(Geom::Affine const &transform);
-gchar *sp_svg_transform_write(Geom::Affine const *transform);
+char *sp_svg_transform_write(Geom::Affine const &transform);
+char *sp_svg_transform_write(Geom::Affine const *transform);
double sp_svg_read_percentage( const char * str, double def );
/* NB! As paths can be long, we use here dynamic string */
Geom::PathVector sp_svg_read_pathv( char const * str );
-gchar * sp_svg_write_path( Geom::PathVector const &p );
-gchar * sp_svg_write_path( Geom::Path const &p );
+char * sp_svg_write_path( Geom::PathVector const &p );
+char * sp_svg_write_path( Geom::Path const &p );
#endif // SEEN_SP_SVG_H
diff --git a/src/text-chemistry.h b/src/text-chemistry.h
index 1ae0a1779..c983f005f 100644
--- a/src/text-chemistry.h
+++ b/src/text-chemistry.h
@@ -1,6 +1,8 @@
#ifndef SEEN_TEXT_CHEMISTRY_H
#define SEEN_TEXT_CHEMISTRY_H
+// TODO move to selection-chemistry?
+
/*
* Text commands
*
diff --git a/src/text-editing.h b/src/text-editing.h
index 290a39194..3a86bf48e 100644
--- a/src/text-editing.h
+++ b/src/text-editing.h
@@ -13,7 +13,6 @@
* Released under GNU GPL, read the file 'COPYING' for more information
*/
-#include <glib.h>
#include <utility> // std::pair
#include "libnrtype/Layout-TNG.h"
#include "text-tag-attributes.h"
@@ -54,14 +53,14 @@ double sp_te_get_average_linespacing (SPItem *text);
SPStyle const * sp_te_style_at_position(SPItem const *text, Inkscape::Text::Layout::iterator const &position);
SPObject const * sp_te_object_at_position(SPItem const *text, Inkscape::Text::Layout::iterator const &position);
-Inkscape::Text::Layout::iterator sp_te_insert(SPItem *item, Inkscape::Text::Layout::iterator const &position, gchar const *utf8);
-Inkscape::Text::Layout::iterator sp_te_replace(SPItem *item, Inkscape::Text::Layout::iterator const &start, Inkscape::Text::Layout::iterator const &end, gchar const *utf8);
+Inkscape::Text::Layout::iterator sp_te_insert(SPItem *item, Inkscape::Text::Layout::iterator const &position, char const *utf8);
+Inkscape::Text::Layout::iterator sp_te_replace(SPItem *item, Inkscape::Text::Layout::iterator const &start, Inkscape::Text::Layout::iterator const &end, char const *utf8);
Inkscape::Text::Layout::iterator sp_te_insert_line (SPItem *text, Inkscape::Text::Layout::iterator const &position);
bool sp_te_delete (SPItem *item, Inkscape::Text::Layout::iterator const &start, Inkscape::Text::Layout::iterator const &end, iterator_pair &iter_pair);
-gchar *sp_te_get_string_multiline(SPItem const *text);
+char *sp_te_get_string_multiline(SPItem const *text);
Glib::ustring sp_te_get_string_multiline(SPItem const *text, Inkscape::Text::Layout::iterator const &start, Inkscape::Text::Layout::iterator const &end);
-void sp_te_set_repr_text_multiline(SPItem *text, gchar const *str);
+void sp_te_set_repr_text_multiline(SPItem *text, char const *str);
TextTagAttributes*
text_tag_attributes_at_position(SPItem *item, Inkscape::Text::Layout::iterator const &position, unsigned *char_index);
@@ -70,12 +69,12 @@ void sp_te_adjust_kerning_screen(SPItem *text, Inkscape::Text::Layout::iterator
void sp_te_adjust_dx (SPItem *item, Inkscape::Text::Layout::iterator const &start, Inkscape::Text::Layout::iterator const &end, SPDesktop *desktop, double delta);
void sp_te_adjust_dy (SPItem *item, Inkscape::Text::Layout::iterator const &start, Inkscape::Text::Layout::iterator const &end, SPDesktop *desktop, double delta);
-void sp_te_adjust_rotation_screen(SPItem *text, Inkscape::Text::Layout::iterator const &start, Inkscape::Text::Layout::iterator const &end, SPDesktop *desktop, gdouble pixels);
-void sp_te_adjust_rotation(SPItem *text, Inkscape::Text::Layout::iterator const &start, Inkscape::Text::Layout::iterator const &end, SPDesktop *desktop, gdouble degrees);
-void sp_te_set_rotation(SPItem *text, Inkscape::Text::Layout::iterator const &start, Inkscape::Text::Layout::iterator const &end, SPDesktop *desktop, gdouble degrees);
+void sp_te_adjust_rotation_screen(SPItem *text, Inkscape::Text::Layout::iterator const &start, Inkscape::Text::Layout::iterator const &end, SPDesktop *desktop, double pixels);
+void sp_te_adjust_rotation(SPItem *text, Inkscape::Text::Layout::iterator const &start, Inkscape::Text::Layout::iterator const &end, SPDesktop *desktop, double degrees);
+void sp_te_set_rotation(SPItem *text, Inkscape::Text::Layout::iterator const &start, Inkscape::Text::Layout::iterator const &end, SPDesktop *desktop, double degrees);
-void sp_te_adjust_tspan_letterspacing_screen(SPItem *text, Inkscape::Text::Layout::iterator const &start, Inkscape::Text::Layout::iterator const &end, SPDesktop *desktop, gdouble by);
-void sp_te_adjust_linespacing_screen(SPItem *text, Inkscape::Text::Layout::iterator const &start, Inkscape::Text::Layout::iterator const &end, SPDesktop *desktop, gdouble by);
+void sp_te_adjust_tspan_letterspacing_screen(SPItem *text, Inkscape::Text::Layout::iterator const &start, Inkscape::Text::Layout::iterator const &end, SPDesktop *desktop, double by);
+void sp_te_adjust_linespacing_screen(SPItem *text, Inkscape::Text::Layout::iterator const &start, Inkscape::Text::Layout::iterator const &end, SPDesktop *desktop, double by);
void sp_te_apply_style(SPItem *text, Inkscape::Text::Layout::iterator const &start, Inkscape::Text::Layout::iterator const &end, SPCSSAttr const *css);
bool is_part_of_text_subtree (SPObject *obj);
diff --git a/src/transf_mat_3x4.h b/src/transf_mat_3x4.h
index 8542e5e00..7c0c72120 100644
--- a/src/transf_mat_3x4.h
+++ b/src/transf_mat_3x4.h
@@ -35,7 +35,7 @@ public:
return Geom::atan2(Geom::Point(vp[0], vp[1])) * 180.0/M_PI;
}
void set_infinite_direction (Proj::Axis axis, double angle) { // angle is in degrees
- g_return_if_fail(tmat[2][axis] == 0); // don't set directions for finite VPs
+ if (tmat[2][axis] != 0) return; // don't set directions for finite VPs
double a = angle * M_PI/180;
Geom::Point pt(tmat[0][axis], tmat[1][axis]);
@@ -44,7 +44,7 @@ public:
}
inline bool has_finite_image (Proj::Axis axis) { return (tmat[2][axis] != 0.0); }
- gchar * pt_to_str (Proj::Axis axis);
+ char * pt_to_str (Proj::Axis axis);
bool operator==(const TransfMat3x4 &rhs) const;
TransfMat3x4 operator*(Geom::Affine const &A) const;
diff --git a/src/ui/CMakeLists.txt b/src/ui/CMakeLists.txt
index 2b9dd6e45..e5c605889 100644
--- a/src/ui/CMakeLists.txt
+++ b/src/ui/CMakeLists.txt
@@ -2,7 +2,13 @@
set(ui_SRC
clipboard.cpp
control-manager.cpp
+ dialog-events.cpp
+ draw-anchor.cpp
+ interface.cpp
+ object-edit.cpp
previewholder.cpp
+ shape-editor.cpp
+ tools-switch.cpp
uxmanager.cpp
cache/svg_preview_cache.cpp
@@ -78,6 +84,7 @@ set(ui_SRC
dialog/layers.cpp
dialog/livepatheffect-add.cpp
dialog/livepatheffect-editor.cpp
+ dialog/lpe-fillet-chamfer-properties.cpp
dialog/memory.cpp
dialog/messages.cpp
dialog/new-from-template.cpp
@@ -151,10 +158,17 @@ set(ui_SRC
clipboard.h
control-manager.h
control-types.h
+ dialog-events.h
+ draw-anchor.h
icon-names.h
+ interface.h
+ object-edit.h
previewable.h
previewfillable.h
previewholder.h
+ shape-editor.h
+ tool-factory.h
+ tools-switch.h
uxmanager.h
cache/svg_preview_cache.h
@@ -194,6 +208,7 @@ set(ui_SRC
dialog/layers.h
dialog/livepatheffect-add.h
dialog/livepatheffect-editor.h
+ dialog/lpe-fillet-chamfer-properties.h
dialog/memory.h
dialog/messages.h
dialog/new-from-template.h
diff --git a/src/ui/Makefile_insert b/src/ui/Makefile_insert
index 4081f86f8..7aeb4a83d 100644
--- a/src/ui/Makefile_insert
+++ b/src/ui/Makefile_insert
@@ -6,10 +6,23 @@ ink_common_sources += \
ui/control-manager.cpp \
ui/control-manager.h \
ui/control-types.h \
+ ui/dialog-events.cpp \
+ ui/dialog-events.h \
+ ui/draw-anchor.cpp \
+ ui/draw-anchor.h \
ui/icon-names.h \
+ ui/interface.cpp \
+ ui/interface.h \
+ ui/object-edit.cpp \
+ ui/object-edit.h \
ui/previewable.h \
ui/previewfillable.h \
ui/previewholder.cpp \
ui/previewholder.h \
+ ui/shape-editor.cpp \
+ ui/shape-editor.h \
+ ui/tool-factory.h \
+ ui/tools-switch.cpp \
+ ui/tools-switch.h \
ui/uxmanager.cpp \
ui/uxmanager.h
diff --git a/src/ui/clipboard.cpp b/src/ui/clipboard.cpp
index 4b4b14c22..931a295d8 100644
--- a/src/ui/clipboard.cpp
+++ b/src/ui/clipboard.cpp
@@ -54,7 +54,7 @@
#include <2geom/transforms.h>
#include "box3d.h"
#include "gradient-drag.h"
-#include "marker.h"
+#include "sp-marker.h"
#include "sp-item.h"
#include "sp-item-transform.h" // for sp_item_scale_rel, used in _pasteSize
#include "sp-path.h"
@@ -77,7 +77,7 @@
#include "svg/css-ostringstream.h" // used in copy
#include "ui/tools/text-tool.h"
#include "text-editing.h"
-#include "tools-switch.h"
+#include "ui/tools-switch.h"
#include "path-chemistry.h"
#include "util/units.h"
#include "helper/png-write.h"
diff --git a/src/dialogs/dialog-events.cpp b/src/ui/dialog-events.cpp
index a12e3eafc..6bd93bbc3 100644
--- a/src/dialogs/dialog-events.cpp
+++ b/src/ui/dialog-events.cpp
@@ -29,7 +29,7 @@
#include "preferences.h"
#include "ui/tools/tool-base.h"
-#include "dialog-events.h"
+#include "ui/dialog-events.h"
/**
@@ -187,7 +187,7 @@ void on_transientize (SPDesktop *desktop, win_data *wd )
}
void
-sp_transientize_callback ( Inkscape::Application * /*inkscape*/,
+sp_transientize_callback ( InkscapeApplication * /*inkscape*/,
SPDesktop *desktop, win_data *wd )
{
Inkscape::Preferences *prefs = Inkscape::Preferences::get();
diff --git a/src/dialogs/dialog-events.h b/src/ui/dialog-events.h
index 623058282..b33eb3f38 100644
--- a/src/dialogs/dialog-events.h
+++ b/src/ui/dialog-events.h
@@ -29,9 +29,7 @@ class Entry;
class SPDesktop;
-namespace Inkscape {
-struct Application;
-} // namespace Inkscape
+struct InkscapeApplication;
typedef struct {
GtkWidget *win;
@@ -55,7 +53,7 @@ void sp_transientize ( GtkWidget *win );
void on_transientize ( SPDesktop *desktop,
win_data *wd );
-void sp_transientize_callback ( Inkscape::Application *inkscape,
+void sp_transientize_callback ( InkscapeApplication *inkscape,
SPDesktop *desktop,
win_data *wd );
diff --git a/src/ui/dialog/Makefile_insert b/src/ui/dialog/Makefile_insert
index daa8aea22..26a59ce2c 100644
--- a/src/ui/dialog/Makefile_insert
+++ b/src/ui/dialog/Makefile_insert
@@ -100,6 +100,8 @@ ink_common_sources += \
ui/dialog/template-load-tab.h \
ui/dialog/template-widget.cpp \
ui/dialog/template-widget.h \
+ ui/dialog/tags.cpp \
+ ui/dialpg/tags.h \
ui/dialog/text-edit.cpp \
ui/dialog/text-edit.h \
ui/dialog/tile.cpp \
@@ -114,4 +116,10 @@ ink_common_sources += \
ui/dialog/undo-history.h \
ui/dialog/xml-tree.cpp \
ui/dialog/xml-tree.h \
+ ui/dialog/lpe-powerstroke-properties.cpp \
+ ui/dialog/lpe-powerstroke-properties.h \
+ ui/dialog/objects.cpp \
+ ui/dialog/objects.h \
+ ui/dialog/lpe-fillet-chamfer-properties.cpp \
+ ui/dialog/lpe-fillet-chamfer-properties.h \
$(inkboard_dialogs)
diff --git a/src/ui/dialog/aboutbox.cpp b/src/ui/dialog/aboutbox.cpp
index fad10ae11..50b35ca2f 100644
--- a/src/ui/dialog/aboutbox.cpp
+++ b/src/ui/dialog/aboutbox.cpp
@@ -955,13 +955,13 @@ void AboutBox::initStrings() {
} // namespace UI
} // namespace Inkscape
-/*
+/*
Local Variables:
mode:c++
c-file-style:"stroustrup"
- c-file-offsets:((innamespace . 0)(inline-open . 0))
+ c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
indent-tabs-mode:nil
fill-column:99
End:
*/
-// vim: filetype=c++:expandtab:shiftwidth=4:tabstop=8:softtabstop=4 :
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :
diff --git a/src/ui/dialog/aboutbox.h b/src/ui/dialog/aboutbox.h
index 7b3308672..015e344a1 100644
--- a/src/ui/dialog/aboutbox.h
+++ b/src/ui/dialog/aboutbox.h
@@ -55,13 +55,13 @@ private:
#endif // INKSCAPE_UI_DIALOG_ABOUTBOX_H
-/*
+/*
Local Variables:
mode:c++
c-file-style:"stroustrup"
- c-file-offsets:((innamespace . 0)(inline-open . 0))
+ c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
indent-tabs-mode:nil
fill-column:99
End:
*/
-// vim: filetype=c++:expandtab:shiftwidth=4:tabstop=8:softtabstop=4 :
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :
diff --git a/src/ui/dialog/align-and-distribute.cpp b/src/ui/dialog/align-and-distribute.cpp
index e02ccd3f1..431da7ad1 100644
--- a/src/ui/dialog/align-and-distribute.cpp
+++ b/src/ui/dialog/align-and-distribute.cpp
@@ -38,7 +38,7 @@
#include "sp-item-transform.h"
#include "sp-text.h"
#include "text-editing.h"
-#include "tools-switch.h"
+#include "ui/tools-switch.h"
#include "ui/icon-names.h"
#include "ui/tools/node-tool.h"
#include "ui/tool/multi-path-manipulator.h"
@@ -829,14 +829,14 @@ private :
-static void on_tool_changed(Inkscape::Application */*inkscape*/, Inkscape::UI::Tools::ToolBase */*context*/, AlignAndDistribute *daad)
+static void on_tool_changed(InkscapeApplication */*inkscape*/, Inkscape::UI::Tools::ToolBase */*context*/, AlignAndDistribute *daad)
{
SPDesktop *desktop = SP_ACTIVE_DESKTOP;
if (desktop && desktop->getEventContext())
daad->setMode(tools_active(desktop) == TOOLS_NODES);
}
-static void on_selection_changed(Inkscape::Application */*inkscape*/, Inkscape::Selection */*selection*/, AlignAndDistribute *daad)
+static void on_selection_changed(InkscapeApplication */*inkscape*/, Inkscape::Selection */*selection*/, AlignAndDistribute *daad)
{
daad->randomize_bbox = Geom::OptRect();
}
diff --git a/src/ui/dialog/calligraphic-profile-rename.h b/src/ui/dialog/calligraphic-profile-rename.h
index 3256338eb..fa13db196 100644
--- a/src/ui/dialog/calligraphic-profile-rename.h
+++ b/src/ui/dialog/calligraphic-profile-rename.h
@@ -16,7 +16,7 @@
#endif
#if GLIBMM_DISABLE_DEPRECATED && HAVE_GLIBMM_THREADS_H
-#include <glibmm/threads.h>
+# include <glibmm/threads.h>
#endif
#include <gtkmm/dialog.h>
diff --git a/src/ui/dialog/clonetiler.cpp b/src/ui/dialog/clonetiler.cpp
index 9b67132c0..5ef885ab2 100644
--- a/src/ui/dialog/clonetiler.cpp
+++ b/src/ui/dialog/clonetiler.cpp
@@ -38,7 +38,7 @@
#include "util/units.h"
#include "helper/window.h"
#include "inkscape.h"
-#include "interface.h"
+#include "ui/interface.h"
#include "macros.h"
#include "message-stack.h"
#include "preferences.h"
@@ -1349,7 +1349,7 @@ void CloneTiler::on_picker_color_changed(guint rgba)
is_updating = false;
}
-void CloneTiler::clonetiler_change_selection(Inkscape::Application * /*inkscape*/, Inkscape::Selection *selection, GtkWidget *dlg)
+void CloneTiler::clonetiler_change_selection(InkscapeApplication * /*inkscape*/, Inkscape::Selection *selection, GtkWidget *dlg)
{
GtkWidget *buttons = GTK_WIDGET(g_object_get_data (G_OBJECT(dlg), "buttons_on_tiles"));
GtkWidget *status = GTK_WIDGET(g_object_get_data (G_OBJECT(dlg), "status"));
@@ -1378,7 +1378,7 @@ void CloneTiler::clonetiler_change_selection(Inkscape::Application * /*inkscape*
}
}
-void CloneTiler::clonetiler_external_change(Inkscape::Application * /*inkscape*/, GtkWidget *dlg)
+void CloneTiler::clonetiler_external_change(InkscapeApplication * /*inkscape*/, GtkWidget *dlg)
{
clonetiler_change_selection (NULL, sp_desktop_selection(SP_ACTIVE_DESKTOP), dlg);
}
diff --git a/src/ui/dialog/clonetiler.h b/src/ui/dialog/clonetiler.h
index e2a0240ee..70da86338 100644
--- a/src/ui/dialog/clonetiler.h
+++ b/src/ui/dialog/clonetiler.h
@@ -11,7 +11,6 @@
#define __SP_CLONE_TILER_H__
#include "ui/widget/panel.h"
-#include <gtk/gtk.h>
#include "ui/dialog/desktop-tracker.h"
#include "ui/widget/color-picker.h"
@@ -58,8 +57,8 @@ protected:
static void clonetiler_keep_bbox_toggled(GtkToggleButton *tb, gpointer /*data*/);
static void clonetiler_apply(GtkWidget */*widget*/, GtkWidget *dlg);
static void clonetiler_unclump(GtkWidget */*widget*/, void *);
- static void clonetiler_change_selection(Inkscape::Application * /*inkscape*/, Inkscape::Selection *selection, GtkWidget *dlg);
- static void clonetiler_external_change(Inkscape::Application * /*inkscape*/, GtkWidget *dlg);
+ static void clonetiler_change_selection(InkscapeApplication * /*inkscape*/, Inkscape::Selection *selection, GtkWidget *dlg);
+ static void clonetiler_external_change(InkscapeApplication * /*inkscape*/, GtkWidget *dlg);
static void clonetiler_disconnect_gsignal(GObject *widget, gpointer source);
static void clonetiler_reset(GtkWidget */*widget*/, GtkWidget *dlg);
static guint clonetiler_number_of_clones(SPObject *obj);
diff --git a/src/ui/dialog/color-item.cpp b/src/ui/dialog/color-item.cpp
index 7940c28ae..bab7e18e1 100644
--- a/src/ui/dialog/color-item.cpp
+++ b/src/ui/dialog/color-item.cpp
@@ -684,6 +684,7 @@ void ColorItem::buttonClicked(bool secondary)
descr = secondary? _("Set stroke color to none") : _("Set fill color to none");
break;
}
+//mark
case ege::PaintDef::RGB: {
Glib::ustring colorspec;
if ( _grad ){
@@ -696,6 +697,7 @@ void ColorItem::buttonClicked(bool secondary)
sp_svg_write_color(c, sizeof(c), rgba);
colorspec = c;
}
+//end mark
sp_repr_css_set_property( css, attrName, colorspec.c_str() );
descr = secondary? _("Set stroke color from swatch") : _("Set fill color from swatch");
break;
diff --git a/src/ui/dialog/desktop-tracker.cpp b/src/ui/dialog/desktop-tracker.cpp
index 8a359dd2d..3ed998252 100644
--- a/src/ui/dialog/desktop-tracker.cpp
+++ b/src/ui/dialog/desktop-tracker.cpp
@@ -94,7 +94,7 @@ sigc::connection DesktopTracker::connectDesktopChanged( const sigc::slot<void, S
return desktopChangedSig.connect(slot);
}
-gboolean DesktopTracker::activateDesktopCB(Inkscape::Application */*inkscape*/, SPDesktop *desktop, DesktopTracker *self )
+gboolean DesktopTracker::activateDesktopCB(InkscapeApplication */*inkscape*/, SPDesktop *desktop, DesktopTracker *self )
{
if (self && self->trackActive) {
self->setDesktop(desktop);
diff --git a/src/ui/dialog/desktop-tracker.h b/src/ui/dialog/desktop-tracker.h
index 7da55cf2f..7b944ddfa 100644
--- a/src/ui/dialog/desktop-tracker.h
+++ b/src/ui/dialog/desktop-tracker.h
@@ -12,11 +12,10 @@
typedef struct _GtkWidget GtkWidget;
class SPDesktop;
+struct InkscapeApplication;
namespace Inkscape {
-struct Application;
-
namespace UI {
namespace Dialog {
@@ -37,7 +36,7 @@ public:
sigc::connection connectDesktopChanged( const sigc::slot<void, SPDesktop*> & slot );
private:
- static gboolean activateDesktopCB(Inkscape::Application *inkscape, SPDesktop *desktop, DesktopTracker *self );
+ static gboolean activateDesktopCB(InkscapeApplication *inkscape, SPDesktop *desktop, DesktopTracker *self );
static bool hierarchyChangeCB(GtkWidget *widget, GtkWidget* prev, DesktopTracker *self);
void handleHierarchyChange();
diff --git a/src/ui/dialog/dialog-manager.cpp b/src/ui/dialog/dialog-manager.cpp
index 7e69e439a..7b1b36908 100644
--- a/src/ui/dialog/dialog-manager.cpp
+++ b/src/ui/dialog/dialog-manager.cpp
@@ -54,6 +54,8 @@
#include "ui/dialog/xml-tree.h"
#include "ui/dialog/clonetiler.h"
#include "ui/dialog/svg-fonts-dialog.h"
+#include "ui/dialog/objects.h"
+#include "ui/dialog/tags.h"
namespace Inkscape {
namespace UI {
@@ -70,13 +72,13 @@ inline Dialog *create() { return PanelDialog<B>::template create<T>(); }
/**
* This class is provided as a container for Inkscape's various
- * dialogs. This allows Inkscape::Application to treat the various
+ * dialogs. This allows InkscapeApplication to treat the various
* dialogs it invokes, as abstractions.
*
* DialogManager is essentially a cache of dialogs. It lets us
* initialize dialogs lazily - instead of constructing them during
* application startup, they're constructed the first time they're
- * actually invoked by Inkscape::Application. The constructed
+ * actually invoked by InkscapeApplication. The constructed
* dialog is held here after that, so future invokations of the
* dialog don't need to get re-constructed each time. The memory for
* the dialogs are then reclaimed when the DialogManager is destroyed.
@@ -110,6 +112,8 @@ DialogManager::DialogManager() {
registerFactory("Glyphs", &create<GlyphsPanel, FloatingBehavior>);
registerFactory("IconPreviewPanel", &create<IconPreviewPanel, FloatingBehavior>);
registerFactory("LayersPanel", &create<LayersPanel, FloatingBehavior>);
+ registerFactory("ObjectsPanel", &create<ObjectsPanel, FloatingBehavior>);
+ registerFactory("TagsPanel", &create<TagsPanel, FloatingBehavior>);
registerFactory("LivePathEffect", &create<LivePathEffectEditor, FloatingBehavior>);
registerFactory("Memory", &create<Memory, FloatingBehavior>);
registerFactory("Messages", &create<Messages, FloatingBehavior>);
@@ -143,6 +147,8 @@ DialogManager::DialogManager() {
registerFactory("Glyphs", &create<GlyphsPanel, DockBehavior>);
registerFactory("IconPreviewPanel", &create<IconPreviewPanel, DockBehavior>);
registerFactory("LayersPanel", &create<LayersPanel, DockBehavior>);
+ registerFactory("ObjectsPanel", &create<ObjectsPanel, DockBehavior>);
+ registerFactory("TagsPanel", &create<TagsPanel, DockBehavior>);
registerFactory("LivePathEffect", &create<LivePathEffectEditor, DockBehavior>);
registerFactory("Memory", &create<Memory, DockBehavior>);
registerFactory("Messages", &create<Messages, DockBehavior>);
diff --git a/src/ui/dialog/dialog.cpp b/src/ui/dialog/dialog.cpp
index 645294bb5..213965a18 100644
--- a/src/ui/dialog/dialog.cpp
+++ b/src/ui/dialog/dialog.cpp
@@ -28,7 +28,7 @@
#include "desktop-handles.h"
#include "shortcuts.h"
#include "preferences.h"
-#include "interface.h"
+#include "ui/interface.h"
#include "verbs.h"
#include "ui/tool/event-utils.h"
@@ -41,7 +41,7 @@ namespace Inkscape {
namespace UI {
namespace Dialog {
-void sp_retransientize(Inkscape::Application */*inkscape*/, SPDesktop *desktop, gpointer dlgPtr)
+void sp_retransientize(InkscapeApplication */*inkscape*/, SPDesktop *desktop, gpointer dlgPtr)
{
Dialog *dlg = static_cast<Dialog *>(dlgPtr);
dlg->onDesktopActivated (desktop);
@@ -317,20 +317,8 @@ void Dialog::_apply()
void Dialog::_close()
{
- GtkWidget *dlg = GTK_WIDGET(_behavior->gobj());
-
- GdkEventAny event;
- event.type = GDK_DELETE;
- event.window = gtk_widget_get_window(dlg);
- event.send_event = TRUE;
-
- if (event.window)
- g_object_ref(G_OBJECT(event.window));
-
- gtk_main_do_event ((GdkEvent*)&event);
-
- if (event.window)
- g_object_unref(G_OBJECT(event.window));
+ _behavior->hide();
+ _onDeleteEvent(NULL);
}
void Dialog::_defocus()
diff --git a/src/ui/dialog/dialog.h b/src/ui/dialog/dialog.h
index ec5d203bc..ccff43a56 100644
--- a/src/ui/dialog/dialog.h
+++ b/src/ui/dialog/dialog.h
@@ -18,10 +18,10 @@
#include "floating-behavior.h"
class SPDesktop;
+struct InkscapeApplication;
namespace Inkscape {
class Selection;
-struct Application;
}
namespace Inkscape {
@@ -30,7 +30,7 @@ namespace Dialog {
enum BehaviorType { FLOATING, DOCK };
-void sp_retransientize(Inkscape::Application *inkscape, SPDesktop *desktop, gpointer dlgPtr);
+void sp_retransientize(InkscapeApplication *inkscape, SPDesktop *desktop, gpointer dlgPtr);
gboolean sp_retransientize_again(gpointer dlgPtr);
void sp_dialog_shutdown(GObject *object, gpointer dlgPtr);
diff --git a/src/ui/dialog/dock-behavior.cpp b/src/ui/dialog/dock-behavior.cpp
index 9b216e841..50a6db208 100644
--- a/src/ui/dialog/dock-behavior.cpp
+++ b/src/ui/dialog/dock-behavior.cpp
@@ -18,13 +18,13 @@
#include "dock-behavior.h"
#include "inkscape.h"
#include "desktop.h"
-#include "interface.h"
+#include "ui/interface.h"
#include "widgets/icon.h"
#include "ui/widget/dock.h"
#include "verbs.h"
#include "dialog.h"
#include "preferences.h"
-#include "dialogs/dialog-events.h"
+#include "ui/dialog-events.h"
#include <gtkmm/invisible.h>
#include <gtkmm/label.h>
diff --git a/src/ui/dialog/document-metadata.cpp b/src/ui/dialog/document-metadata.cpp
index 09c505860..77ea175d9 100644
--- a/src/ui/dialog/document-metadata.cpp
+++ b/src/ui/dialog/document-metadata.cpp
@@ -223,7 +223,7 @@ DocumentMetadata::_handleDocumentReplaced(SPDesktop* desktop, SPDocument *)
}
void
-DocumentMetadata::_handleActivateDesktop(Inkscape::Application *, SPDesktop *desktop)
+DocumentMetadata::_handleActivateDesktop(InkscapeApplication *, SPDesktop *desktop)
{
Inkscape::XML::Node *repr = sp_desktop_namedview(desktop)->getRepr();
repr->addListener(&_repr_events, this);
@@ -231,7 +231,7 @@ DocumentMetadata::_handleActivateDesktop(Inkscape::Application *, SPDesktop *des
}
void
-DocumentMetadata::_handleDeactivateDesktop(Inkscape::Application *, SPDesktop *desktop)
+DocumentMetadata::_handleDeactivateDesktop(InkscapeApplication *, SPDesktop *desktop)
{
Inkscape::XML::Node *repr = sp_desktop_namedview(desktop)->getRepr();
repr->removeListenerByData(this);
diff --git a/src/ui/dialog/document-metadata.h b/src/ui/dialog/document-metadata.h
index 3b7ed1ec8..77084bc3d 100644
--- a/src/ui/dialog/document-metadata.h
+++ b/src/ui/dialog/document-metadata.h
@@ -56,8 +56,8 @@ protected:
void init();
void _handleDocumentReplaced(SPDesktop* desktop, SPDocument *document);
- void _handleActivateDesktop(Inkscape::Application *application, SPDesktop *desktop);
- void _handleDeactivateDesktop(Inkscape::Application *application, SPDesktop *desktop);
+ void _handleActivateDesktop(InkscapeApplication *application, SPDesktop *desktop);
+ void _handleDeactivateDesktop(InkscapeApplication *application, SPDesktop *desktop);
Gtk::Notebook _notebook;
diff --git a/src/ui/dialog/document-properties.cpp b/src/ui/dialog/document-properties.cpp
index 1f220b246..dc8a0fee2 100644
--- a/src/ui/dialog/document-properties.cpp
+++ b/src/ui/dialog/document-properties.cpp
@@ -31,13 +31,13 @@
#include "inkscape.h"
#include "io/sys.h"
#include "preferences.h"
-#include "shape-editor.h"
+#include "ui/shape-editor.h"
#include "sp-namedview.h"
#include "sp-root.h"
#include "sp-script.h"
#include "style.h"
#include "svg/stringstream.h"
-#include "tools-switch.h"
+#include "ui/tools-switch.h"
#include "ui/widget/color-picker.h"
#include "ui/widget/scalar-unit.h"
#include "ui/dialog/filedialog.h"
@@ -1594,7 +1594,7 @@ void DocumentProperties::_handleDocumentReplaced(SPDesktop* desktop, SPDocument
update();
}
-void DocumentProperties::_handleActivateDesktop(Inkscape::Application *, SPDesktop *desktop)
+void DocumentProperties::_handleActivateDesktop(InkscapeApplication *, SPDesktop *desktop)
{
Inkscape::XML::Node *repr = sp_desktop_namedview(desktop)->getRepr();
repr->addListener(&_repr_events, this);
@@ -1603,7 +1603,7 @@ void DocumentProperties::_handleActivateDesktop(Inkscape::Application *, SPDeskt
update();
}
-void DocumentProperties::_handleDeactivateDesktop(Inkscape::Application *, SPDesktop *desktop)
+void DocumentProperties::_handleDeactivateDesktop(InkscapeApplication *, SPDesktop *desktop)
{
Inkscape::XML::Node *repr = sp_desktop_namedview(desktop)->getRepr();
repr->removeListenerByData(this);
diff --git a/src/ui/dialog/document-properties.h b/src/ui/dialog/document-properties.h
index 495f3177d..ee7e88b18 100644
--- a/src/ui/dialog/document-properties.h
+++ b/src/ui/dialog/document-properties.h
@@ -94,8 +94,8 @@ protected:
void save_default_metadata();
void _handleDocumentReplaced(SPDesktop* desktop, SPDocument *document);
- void _handleActivateDesktop(Inkscape::Application *application, SPDesktop *desktop);
- void _handleDeactivateDesktop(Inkscape::Application *application, SPDesktop *desktop);
+ void _handleActivateDesktop(InkscapeApplication *application, SPDesktop *desktop);
+ void _handleDeactivateDesktop(InkscapeApplication *application, SPDesktop *desktop);
Inkscape::XML::SignalObserver _emb_profiles_observer, _scripts_observer;
Gtk::Notebook _notebook;
diff --git a/src/ui/dialog/export.cpp b/src/ui/dialog/export.cpp
index 913713e5c..a4d8801f7 100644
--- a/src/ui/dialog/export.cpp
+++ b/src/ui/dialog/export.cpp
@@ -62,10 +62,10 @@
#include "sp-namedview.h"
#include "selection-chemistry.h"
-#include "dialogs/dialog-events.h"
+#include "ui/dialog-events.h"
#include "preferences.h"
#include "verbs.h"
-#include "interface.h"
+#include "ui/interface.h"
#include "sp-root.h"
#include "extension/output.h"
diff --git a/src/ui/dialog/export.h b/src/ui/dialog/export.h
index 6f3c0dfac..23af0109b 100644
--- a/src/ui/dialog/export.h
+++ b/src/ui/dialog/export.h
@@ -12,20 +12,11 @@
#ifndef SP_EXPORT_H
#define SP_EXPORT_H
-#include <gtk/gtk.h>
-#include <glibmm/i18n.h>
-
-#include <gtkmm/comboboxtext.h>
-#include <gtkmm/expander.h>
-#include <gtkmm/frame.h>
#include <gtkmm/progressbar.h>
-#include <gtkmm/textview.h>
-#include "desktop.h"
#include "ui/dialog/desktop-tracker.h"
#include "ui/widget/panel.h"
#include "ui/widget/button.h"
-#include "ui/widget/entry.h"
namespace Gtk {
class Dialog;
diff --git a/src/ui/dialog/extension-editor.cpp b/src/ui/dialog/extension-editor.cpp
index cd5491c24..9bdddc0e0 100644
--- a/src/ui/dialog/extension-editor.cpp
+++ b/src/ui/dialog/extension-editor.cpp
@@ -25,7 +25,7 @@
#include "verbs.h"
#include "preferences.h"
-#include "interface.h"
+#include "ui/interface.h"
#include "extension/extension.h"
#include "extension/db.h"
diff --git a/src/ui/dialog/filedialog.cpp b/src/ui/dialog/filedialog.cpp
index e71605739..00ed09551 100644
--- a/src/ui/dialog/filedialog.cpp
+++ b/src/ui/dialog/filedialog.cpp
@@ -20,7 +20,7 @@
#include "filedialog.h"
#include "gc-core.h"
-#include <dialogs/dialog-events.h>
+#include "ui/dialog-events.h"
#include "extension/output.h"
#include "preferences.h"
diff --git a/src/ui/dialog/filedialog.h b/src/ui/dialog/filedialog.h
index 8dfcf5dce..175031bcf 100644
--- a/src/ui/dialog/filedialog.h
+++ b/src/ui/dialog/filedialog.h
@@ -48,6 +48,7 @@ typedef enum {
IMPORT_TYPES,
EXPORT_TYPES,
EXE_TYPES,
+ SWATCH_TYPES,
CUSTOM_TYPE
} FileDialogType;
diff --git a/src/ui/dialog/filedialogimpl-gtkmm.cpp b/src/ui/dialog/filedialogimpl-gtkmm.cpp
index 8ba3ad684..5d330f7f0 100644
--- a/src/ui/dialog/filedialogimpl-gtkmm.cpp
+++ b/src/ui/dialog/filedialogimpl-gtkmm.cpp
@@ -21,9 +21,11 @@
#include <config.h>
#endif
+#include <iostream>
+
#include "filedialogimpl-gtkmm.h"
-#include "dialogs/dialog-events.h"
-#include "interface.h"
+#include "ui/dialog-events.h"
+#include "ui/interface.h"
#include "io/sys.h"
#include "path-prefix.h"
#include "preferences.h"
@@ -40,6 +42,9 @@
#include <glibmm/i18n.h>
#include <glibmm/miscutils.h>
+#include <glibmm/regex.h>
+
+#include "document.h"
#include "extension/input.h"
#include "extension/output.h"
#include "extension/db.h"
@@ -190,6 +195,40 @@ void SVGPreview::showImage(Glib::ustring &theFileName)
{
Glib::ustring fileName = theFileName;
+ // Let's get real width and height from SVG file. These are template
+ // files so we assume they are well formed.
+
+ // std::cout << "SVGPreview::showImage: " << theFileName << std::endl;
+ std::ifstream input(theFileName.c_str());
+
+ std::string width;
+ std::string height;
+
+ if( !input ) {
+ std::cerr << "SVGPreview::showImage: Failed to open file: " << theFileName << std::endl;
+ } else {
+
+ std::string token;
+
+ Glib::MatchInfo match_info;
+ Glib::RefPtr<Glib::Regex> regex1 = Glib::Regex::create("width=\"(.*)\"");
+ Glib::RefPtr<Glib::Regex> regex2 = Glib::Regex::create("height=\"(.*)\"");
+
+ while( !input.eof() && (height.empty() || width.empty()) ) {
+
+ input >> token;
+ // std::cout << "|" << token << "|" << std::endl;
+
+ if (regex1->match(token, match_info)) {
+ width = match_info.fetch(1).raw();
+ }
+
+ if (regex2->match(token, match_info)) {
+ height = match_info.fetch(1).raw();
+ }
+
+ }
+ }
/*#####################################
# LET'S HAVE SOME FUN WITH SVG!
@@ -269,7 +308,7 @@ void SVGPreview::showImage(Glib::ustring &theFileName)
" style=\"font-size:24.000000;font-style:normal;font-weight:normal;"
" fill:#000000;fill-opacity:1.0000000;stroke:none;"
" font-family:Sans\"\n"
- " x=\"10\" y=\"26\">%d x %d</text>\n" //# VALUES HERE
+ " x=\"10\" y=\"26\">%s x %s</text>\n" //# VALUES HERE
"</svg>\n\n";
// if (!Glib::get_charset()) //If we are not utf8
@@ -279,7 +318,7 @@ void SVGPreview::showImage(Glib::ustring &theFileName)
/* FIXME: Do proper XML quoting for fileName. */
gchar *xmlBuffer =
g_strdup_printf(xformat, previewWidth, previewHeight, imgX, imgY, scaledImgWidth, scaledImgHeight,
- fileName.c_str(), rectX, rectY, rectWidth, rectHeight, imgWidth, imgHeight);
+ fileName.c_str(), rectX, rectY, rectWidth, rectHeight, width.c_str(), height.c_str() );
// g_message("%s\n", xmlBuffer);
diff --git a/src/ui/dialog/filedialogimpl-win32.cpp b/src/ui/dialog/filedialogimpl-win32.cpp
index 1eeee0592..ee6a0ef3a 100644
--- a/src/ui/dialog/filedialogimpl-win32.cpp
+++ b/src/ui/dialog/filedialogimpl-win32.cpp
@@ -31,7 +31,7 @@
//Inkscape includes
#include "inkscape.h"
-#include "dialogs/dialog-events.h"
+#include "ui/dialog-events.h"
#include "extension/input.h"
#include "extension/output.h"
#include "extension/db.h"
@@ -1853,7 +1853,6 @@ void FileSaveDialogImplWin32::GetSaveFileName_thread()
ofn.nFilterIndex = _filter_index;
ofn.lpfnHook = GetSaveFileName_hookproc;
ofn.lCustData = (LPARAM)this;
-
_result = GetSaveFileNameW(&ofn) != 0;
g_assert(ofn.nFilterIndex >= 1 && ofn.nFilterIndex <= _filter_count);
diff --git a/src/ui/dialog/filedialogimpl-win32.h b/src/ui/dialog/filedialogimpl-win32.h
index c523f041d..f77249abd 100644
--- a/src/ui/dialog/filedialogimpl-win32.h
+++ b/src/ui/dialog/filedialogimpl-win32.h
@@ -22,13 +22,14 @@
#endif
#endif
+#include "filedialogimpl-gtkmm.h"
+
#include "gc-core.h"
// define WINVER high enough so we get the correct OPENFILENAMEW size
#ifndef WINVER
#define WINVER 0x0500
#endif
#include <windows.h>
-#include "filedialogimpl-gtkmm.h"
namespace Inkscape
diff --git a/src/ui/dialog/fill-and-stroke.h b/src/ui/dialog/fill-and-stroke.h
index 340cb860f..35c98ef9c 100644
--- a/src/ui/dialog/fill-and-stroke.h
+++ b/src/ui/dialog/fill-and-stroke.h
@@ -41,7 +41,7 @@ public:
virtual void setDesktop(SPDesktop *desktop);
- void selectionChanged(Inkscape::Application *inkscape,
+ void selectionChanged(InkscapeApplication *inkscape,
Inkscape::Selection *selection);
void showPageFill();
diff --git a/src/ui/dialog/find.cpp b/src/ui/dialog/find.cpp
index 37f2761df..1a4823e4a 100644
--- a/src/ui/dialog/find.cpp
+++ b/src/ui/dialog/find.cpp
@@ -31,9 +31,9 @@
#include "selection.h"
#include "desktop-handles.h"
-#include "dialogs/dialog-events.h"
+#include "ui/dialog-events.h"
#include "verbs.h"
-#include "interface.h"
+#include "ui/interface.h"
#include "preferences.h"
#include "sp-text.h"
#include "sp-flowtext.h"
diff --git a/src/ui/dialog/floating-behavior.cpp b/src/ui/dialog/floating-behavior.cpp
index dd07f009a..11db14801 100644
--- a/src/ui/dialog/floating-behavior.cpp
+++ b/src/ui/dialog/floating-behavior.cpp
@@ -28,8 +28,8 @@
#include "inkscape.h"
#include "desktop.h"
-#include "dialogs/dialog-events.h"
-#include "interface.h"
+#include "ui/dialog-events.h"
+#include "ui/interface.h"
#include "preferences.h"
#include "verbs.h"
diff --git a/src/ui/dialog/font-substitution.cpp b/src/ui/dialog/font-substitution.cpp
index 6e9ecc3c8..db7bdf222 100644
--- a/src/ui/dialog/font-substitution.cpp
+++ b/src/ui/dialog/font-substitution.cpp
@@ -27,7 +27,7 @@
#include "document.h"
#include "selection.h"
-#include "dialogs/dialog-events.h"
+#include "ui/dialog-events.h"
#include "desktop-handles.h"
#include "selection-chemistry.h"
#include "preferences.h"
diff --git a/src/ui/dialog/grid-arrange-tab.cpp b/src/ui/dialog/grid-arrange-tab.cpp
index 72217c729..1417b39fa 100644
--- a/src/ui/dialog/grid-arrange-tab.cpp
+++ b/src/ui/dialog/grid-arrange-tab.cpp
@@ -572,7 +572,7 @@ void GridArrangeTab::updateSelection()
## Experimental
##########################*/
-static void updateSelectionCallback(Inkscape::Application */*inkscape*/, Inkscape::Selection */*selection*/, GridArrangeTab *dlg)
+static void updateSelectionCallback(InkscapeApplication */*inkscape*/, Inkscape::Selection */*selection*/, GridArrangeTab *dlg)
{
dlg->updateSelection();
}
diff --git a/src/ui/dialog/grid-arrange-tab.h b/src/ui/dialog/grid-arrange-tab.h
index 9d6700b39..a137d1694 100644
--- a/src/ui/dialog/grid-arrange-tab.h
+++ b/src/ui/dialog/grid-arrange-tab.h
@@ -17,14 +17,16 @@
#ifndef INKSCAPE_UI_DIALOG_GRID_ARRANGE_TAB_H
#define INKSCAPE_UI_DIALOG_GRID_ARRANGE_TAB_H
-#include <gtkmm.h>
-
+#include "ui/widget/scalar-unit.h"
#include "ui/dialog/arrange-tab.h"
#include "ui/widget/anchor-selector.h"
-#include "ui/widget/scalar-unit.h"
#include "ui/widget/spinbutton.h"
+#include <gtkmm/checkbutton.h>
+#include <gtkmm/radiobutton.h>
+#include <gtkmm/radiobuttongroup.h>
+
namespace Inkscape {
namespace UI {
namespace Dialog {
diff --git a/src/ui/dialog/guides.cpp b/src/ui/dialog/guides.cpp
index 80740113c..4519a905f 100644
--- a/src/ui/dialog/guides.cpp
+++ b/src/ui/dialog/guides.cpp
@@ -28,7 +28,7 @@
#include "ui/tools/tool-base.h"
#include "widgets/desktop-widget.h"
#include <glibmm/i18n.h>
-#include "dialogs/dialog-events.h"
+#include "ui/dialog-events.h"
#include "message-context.h"
#include "xml/repr.h"
#include "verbs.h"
@@ -100,7 +100,7 @@ void GuidelinePropertiesDialog::_onOK()
double rad_angle = Geom::deg_to_rad( deg_angle );
normal = Geom::rot90(Geom::Point::polar(rad_angle, 1.0));
}
- sp_guide_set_normal(*_guide, normal, true);
+ _guide->set_normal(normal, true);
double const points_x = _spin_button_x.getValue("px");
double const points_y = _spin_button_y.getValue("px");
@@ -108,11 +108,11 @@ void GuidelinePropertiesDialog::_onOK()
if (!_mode)
newpos += _oldpos;
- sp_guide_moveto(*_guide, newpos, true);
+ _guide->moveto(newpos, true);
const gchar* name = g_strdup( _label_entry.getEntry()->get_text().c_str() );
- sp_guide_set_label(*_guide, name, true);
+ _guide->set_label(name, true);
g_free((gpointer) name);
#if WITH_GTKMM_3_0
@@ -124,7 +124,7 @@ void GuidelinePropertiesDialog::_onOK()
#endif
//TODO: why 257? verify this!
- sp_guide_set_color(*_guide, r, g, b, true);
+ _guide->set_color(r, g, b, true);
DocumentUndo::done(_guide->document, SP_VERB_NONE,
_("Set guide properties"));
@@ -295,16 +295,17 @@ void GuidelinePropertiesDialog::_setup() {
signal_response().connect(sigc::mem_fun(*this, &GuidelinePropertiesDialog::_response));
// initialize dialog
- _oldpos = _guide->point_on_line;
+ _oldpos = _guide->getPoint();
if (_guide->isVertical()) {
_oldangle = 90;
} else if (_guide->isHorizontal()) {
_oldangle = 0;
} else {
- _oldangle = Geom::rad_to_deg( std::atan2( - _guide->normal_to_line[Geom::X], _guide->normal_to_line[Geom::Y] ) );
+ _oldangle = Geom::rad_to_deg( std::atan2( - _guide->getNormal()[Geom::X], _guide->getNormal()[Geom::Y] ) );
}
{
+ // FIXME holy crap!!!
Inkscape::XML::Node *repr = _guide->getRepr();
const gchar *guide_id = repr->attribute("id");
gchar *label = g_strdup_printf(_("Guideline ID: %s"), guide_id);
@@ -312,7 +313,7 @@ void GuidelinePropertiesDialog::_setup() {
g_free(label);
}
{
- gchar *guide_description = sp_guide_description(_guide, false);
+ gchar *guide_description = _guide->description(false);
gchar *label = g_strdup_printf(_("Current: %s"), guide_description);
g_free(guide_description);
_label_descr.set_markup(label);
@@ -320,15 +321,15 @@ void GuidelinePropertiesDialog::_setup() {
}
// init name entry
- _label_entry.getEntry()->set_text(_guide->label ? _guide->label : "");
+ _label_entry.getEntry()->set_text(_guide->getLabel() ? _guide->getLabel() : "");
#if WITH_GTKMM_3_0
Gdk::RGBA c;
- c.set_rgba(((_guide->color>>24)&0xff) / 255.0, ((_guide->color>>16)&0xff) / 255.0, ((_guide->color>>8)&0xff) / 255.0);
+ c.set_rgba(((_guide->getColor()>>24)&0xff) / 255.0, ((_guide->getColor()>>16)&0xff) / 255.0, ((_guide->getColor()>>8)&0xff) / 255.0);
_color.set_rgba(c);
#else
Gdk::Color c;
- c.set_rgb_p(((_guide->color>>24)&0xff) / 255.0, ((_guide->color>>16)&0xff) / 255.0, ((_guide->color>>8)&0xff) / 255.0);
+ c.set_rgb_p(((_guide->getColor()>>24)&0xff) / 255.0, ((_guide->getColor()>>16)&0xff) / 255.0, ((_guide->getColor()>>8)&0xff) / 255.0);
_color.set_color(c);
#endif
diff --git a/src/ui/dialog/inkscape-preferences.h b/src/ui/dialog/inkscape-preferences.h
index 9f37626ed..dcea91741 100644
--- a/src/ui/dialog/inkscape-preferences.h
+++ b/src/ui/dialog/inkscape-preferences.h
@@ -545,9 +545,9 @@ private:
Local Variables:
mode:c++
c-file-style:"stroustrup"
- c-file-offsets:((innamespace . 0)(inline-open . 0))
+ c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
indent-tabs-mode:nil
fill-column:99
End:
*/
-// vim: filetype=c++:expandtab:shiftwidth=4:tabstop=8:softtabstop=4 :
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :
diff --git a/src/ui/dialog/lpe-fillet-chamfer-properties.cpp b/src/ui/dialog/lpe-fillet-chamfer-properties.cpp
new file mode 100644
index 000000000..ad8b66b8c
--- /dev/null
+++ b/src/ui/dialog/lpe-fillet-chamfer-properties.cpp
@@ -0,0 +1,278 @@
+/**
+ * From the code of Liam P.White from his Power Stroke Knot dialog
+ *
+ * Released under GNU GPL. Read the file 'COPYING' for more information
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#if GLIBMM_DISABLE_DEPRECATED &&HAVE_GLIBMM_THREADS_H
+#include <glibmm/threads.h>
+#endif
+
+#include <gtkmm.h>
+#include "lpe-fillet-chamfer-properties.h"
+#include <boost/lexical_cast.hpp>
+#include <glibmm/main.h>
+#include <glibmm/i18n.h>
+#include "inkscape.h"
+#include "desktop.h"
+#include "document.h"
+#include "document-undo.h"
+#include "layer-manager.h"
+#include "message-stack.h"
+#include "desktop-handles.h"
+#include "sp-object.h"
+#include "sp-item.h"
+#include "verbs.h"
+#include "selection.h"
+#include "selection-chemistry.h"
+#include "ui/icon-names.h"
+#include "ui/widget/imagetoggler.h"
+#include "util/units.h"
+#include <cmath>
+
+//#include "event-context.h"
+
+namespace Inkscape {
+namespace UI {
+namespace Dialogs {
+
+FilletChamferPropertiesDialog::FilletChamferPropertiesDialog()
+ : _desktop(NULL), _knotpoint(NULL), _position_visible(false)
+{
+ Gtk::Box *mainVBox = get_vbox();
+ mainVBox->set_homogeneous(false);
+ _layout_table.set_spacings(4);
+ _layout_table.resize(2, 2);
+
+ // Layer name widgets
+ _fillet_chamfer_position_numeric.set_digits(4);
+ _fillet_chamfer_position_numeric.set_increments(1,1);
+ //todo: get tha max aloable infinity freeze the widget
+ _fillet_chamfer_position_numeric.set_range(0., 999999999999999999.);
+
+ _fillet_chamfer_position_label.set_label(_("Radius (pixels):"));
+ _fillet_chamfer_position_label.set_alignment(1.0, 0.5);
+
+ _layout_table.attach(_fillet_chamfer_position_label, 0, 1, 0, 1, Gtk::FILL,
+ Gtk::FILL);
+ _layout_table.attach(_fillet_chamfer_position_numeric, 1, 2, 0, 1,
+ Gtk::FILL | Gtk::EXPAND, Gtk::FILL);
+ _fillet_chamfer_type_fillet.set_label(_("Fillet"));
+ _fillet_chamfer_type_fillet.set_group(_fillet_chamfer_type_group);
+ _fillet_chamfer_type_inverse_fillet.set_label(_("Inverse fillet"));
+ _fillet_chamfer_type_inverse_fillet.set_group(_fillet_chamfer_type_group);
+ _fillet_chamfer_type_chamfer.set_label(_("Chamfer"));
+ _fillet_chamfer_type_chamfer.set_group(_fillet_chamfer_type_group);
+ _fillet_chamfer_type_double_chamfer.set_label(_("Double chamfer"));
+ _fillet_chamfer_type_double_chamfer.set_group(_fillet_chamfer_type_group);
+
+ mainVBox->pack_start(_layout_table, true, true, 4);
+ mainVBox->pack_start(_fillet_chamfer_type_fillet, true, true, 4);
+ mainVBox->pack_start(_fillet_chamfer_type_inverse_fillet, true, true, 4);
+ mainVBox->pack_start(_fillet_chamfer_type_chamfer, true, true, 4);
+ mainVBox->pack_start(_fillet_chamfer_type_double_chamfer, true, true, 4);
+
+ // Buttons
+ _close_button.set_use_stock(true);
+ _close_button.set_label(Gtk::Stock::CANCEL.id);
+ _close_button.set_can_default();
+
+ _apply_button.set_use_underline(true);
+ _apply_button.set_can_default();
+
+ _close_button.signal_clicked()
+ .connect(sigc::mem_fun(*this, &FilletChamferPropertiesDialog::_close));
+ _apply_button.signal_clicked()
+ .connect(sigc::mem_fun(*this, &FilletChamferPropertiesDialog::_apply));
+
+ signal_delete_event().connect(sigc::bind_return(
+ sigc::hide(sigc::mem_fun(*this, &FilletChamferPropertiesDialog::_close)),
+ true));
+
+ add_action_widget(_close_button, Gtk::RESPONSE_CLOSE);
+ add_action_widget(_apply_button, Gtk::RESPONSE_APPLY);
+
+ _apply_button.grab_default();
+
+ show_all_children();
+
+ set_focus(_fillet_chamfer_position_numeric);
+}
+
+FilletChamferPropertiesDialog::~FilletChamferPropertiesDialog()
+{
+
+ _setDesktop(NULL);
+}
+
+void FilletChamferPropertiesDialog::showDialog(
+ SPDesktop *desktop, Geom::Point knotpoint,
+ const Inkscape::LivePathEffect::
+ FilletChamferPointArrayParamKnotHolderEntity *pt,
+ const gchar *unit,
+ bool use_distance,
+ bool aprox_radius)
+{
+ FilletChamferPropertiesDialog *dialog = new FilletChamferPropertiesDialog();
+
+ dialog->_setDesktop(desktop);
+ dialog->_setUnit(unit);
+ dialog->_set_use_distance(use_distance);
+ dialog->_set_aprox(aprox_radius);
+ dialog->_setKnotPoint(knotpoint);
+ dialog->_setPt(pt);
+
+ dialog->set_title(_("Modify Fillet-Chamfer"));
+ dialog->_apply_button.set_label(_("_Modify"));
+
+ dialog->set_modal(true);
+ desktop->setWindowTransient(dialog->gobj());
+ dialog->property_destroy_with_parent() = true;
+
+ dialog->show();
+ dialog->present();
+}
+
+void FilletChamferPropertiesDialog::_apply()
+{
+ double d_width;
+ double d_pos = _fillet_chamfer_position_numeric.get_value();
+ if (d_pos) {
+ if (_fillet_chamfer_type_fillet.get_active() == true) {
+ d_width = 1;
+ } else if (_fillet_chamfer_type_inverse_fillet.get_active() == true) {
+ d_width = 2;
+ } else if (_fillet_chamfer_type_chamfer.get_active() == true) {
+ d_width = 3;
+ } else {
+ d_width = 4;
+ }
+ if (_flexible) {
+ if (d_pos > 99.99999 || d_pos < 0) {
+ d_pos = 0;
+ }
+ d_pos = _index + (d_pos / 100);
+ } else {
+ d_pos = Inkscape::Util::Quantity::convert(d_pos, unit, "px");
+ d_pos = d_pos * -1;
+ }
+ _knotpoint->knot_set_offset(Geom::Point(d_pos, d_width));
+ }
+ _close();
+}
+
+void FilletChamferPropertiesDialog::_close()
+{
+ _setDesktop(NULL);
+ destroy_();
+ Glib::signal_idle().connect(
+ sigc::bind_return(
+ sigc::bind(sigc::ptr_fun(&::operator delete), this),
+ false
+ )
+ );
+}
+
+bool FilletChamferPropertiesDialog::_handleKeyEvent(GdkEventKey *event)
+{
+ return false;
+}
+
+void FilletChamferPropertiesDialog::_handleButtonEvent(GdkEventButton *event)
+{
+ if ((event->type == GDK_2BUTTON_PRESS) && (event->button == 1)) {
+ _apply();
+ }
+}
+
+void FilletChamferPropertiesDialog::_setKnotPoint(Geom::Point knotpoint)
+{
+ double position;
+ std::string distance_or_radius = std::string(_("Radius "));
+ if(aprox){
+ distance_or_radius = std::string(_("Radius aproximated "));
+ }
+ if(use_distance){
+ distance_or_radius = std::string(_("Knot distance "));
+ }
+ if (knotpoint.x() > 0) {
+ double intpart;
+ position = modf(knotpoint[Geom::X], &intpart) * 100;
+ _flexible = true;
+ _index = intpart;
+ _fillet_chamfer_position_label.set_label(_("Position (%):"));
+ } else {
+ _flexible = false;
+ std::string posConcat = distance_or_radius +
+ std::string(_("(")) + std::string(unit) + std::string(")");
+ _fillet_chamfer_position_label.set_label(_(posConcat.c_str()));
+ position = knotpoint[Geom::X] * -1;
+ position = Inkscape::Util::Quantity::convert(position, "px", unit);
+ }
+ _fillet_chamfer_position_numeric.set_value(position);
+ if (knotpoint.y() == 1) {
+ _fillet_chamfer_type_fillet.set_active(true);
+ } else if (knotpoint.y() == 2) {
+ _fillet_chamfer_type_inverse_fillet.set_active(true);
+ } else if (knotpoint.y() == 3) {
+ _fillet_chamfer_type_chamfer.set_active(true);
+ } else if (knotpoint.y() == 1) {
+ _fillet_chamfer_type_double_chamfer.set_active(true);
+ }
+}
+
+void FilletChamferPropertiesDialog::_setPt(
+ const Inkscape::LivePathEffect::
+ FilletChamferPointArrayParamKnotHolderEntity *pt)
+{
+ _knotpoint = const_cast<
+ Inkscape::LivePathEffect::FilletChamferPointArrayParamKnotHolderEntity *>(
+ pt);
+}
+
+void FilletChamferPropertiesDialog::_setUnit(const gchar *abbr)
+{
+ unit = abbr;
+}
+
+void FilletChamferPropertiesDialog::_set_use_distance(bool use_knot_distance)
+{
+ use_distance = use_knot_distance;
+}
+
+void FilletChamferPropertiesDialog::_set_aprox(bool aprox_radius)
+{
+ aprox = aprox_radius;
+}
+
+void FilletChamferPropertiesDialog::_setDesktop(SPDesktop *desktop)
+{
+ if (desktop) {
+ Inkscape::GC::anchor(desktop);
+ }
+ if (_desktop) {
+ Inkscape::GC::release(_desktop);
+ }
+ _desktop = desktop;
+}
+
+} // namespace
+} // namespace
+} // namespace
+
+/*
+ Local Variables:
+ mode:c++
+ c-file-style:"stroustrup"
+ c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
+ indent-tabs-mode:nil
+ fill-column:99
+ End:
+*/
+// vim:
+// filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99
+// :
diff --git a/src/ui/dialog/lpe-fillet-chamfer-properties.h b/src/ui/dialog/lpe-fillet-chamfer-properties.h
new file mode 100644
index 000000000..47ff97b00
--- /dev/null
+++ b/src/ui/dialog/lpe-fillet-chamfer-properties.h
@@ -0,0 +1,110 @@
+/**
+ *
+ * From the code of Liam P.White from his Power Stroke Knot dialog
+ *
+ * Released under GNU GPL. Read the file 'COPYING' for more information
+ */
+
+#ifndef INKSCAPE_DIALOG_FILLET_CHAMFER_PROPERTIES_H
+#define INKSCAPE_DIALOG_FILLET_CHAMFER_PROPERTIES_H
+
+#include <2geom/point.h>
+#include <gtkmm.h>
+#include "live_effects/parameter/filletchamferpointarray.h"
+
+class SPDesktop;
+
+namespace Inkscape {
+namespace UI {
+namespace Dialogs {
+
+class FilletChamferPropertiesDialog : public Gtk::Dialog {
+public:
+ FilletChamferPropertiesDialog();
+ virtual ~FilletChamferPropertiesDialog();
+
+ Glib::ustring getName() const {
+ return "LayerPropertiesDialog";
+ }
+
+ static void showDialog(SPDesktop *desktop, Geom::Point knotpoint,
+ const Inkscape::LivePathEffect::
+ FilletChamferPointArrayParamKnotHolderEntity *pt,
+ const gchar *unit,
+ bool use_distance,
+ bool aprox_radius);
+
+protected:
+
+ SPDesktop *_desktop;
+ Inkscape::LivePathEffect::FilletChamferPointArrayParamKnotHolderEntity *
+ _knotpoint;
+
+ Gtk::Label _fillet_chamfer_position_label;
+ Gtk::SpinButton _fillet_chamfer_position_numeric;
+ Gtk::RadioButton::Group _fillet_chamfer_type_group;
+ Gtk::RadioButton _fillet_chamfer_type_fillet;
+ Gtk::RadioButton _fillet_chamfer_type_inverse_fillet;
+ Gtk::RadioButton _fillet_chamfer_type_chamfer;
+ Gtk::RadioButton _fillet_chamfer_type_double_chamfer;
+
+ Gtk::Table _layout_table;
+ bool _position_visible;
+ double _index;
+
+ Gtk::Button _close_button;
+ Gtk::Button _apply_button;
+
+ sigc::connection _destroy_connection;
+
+ static FilletChamferPropertiesDialog &_instance() {
+ static FilletChamferPropertiesDialog instance;
+ return instance;
+ }
+
+ void _setDesktop(SPDesktop *desktop);
+ void _setPt(const Inkscape::LivePathEffect::
+ FilletChamferPointArrayParamKnotHolderEntity *pt);
+ void _setUnit(const gchar *abbr);
+ void _set_use_distance(bool use_knot_distance);
+ void _set_aprox(bool aprox_radius);
+ void _apply();
+ void _close();
+ bool _flexible;
+ const gchar *unit;
+ bool use_distance;
+ bool aprox;
+ void _setKnotPoint(Geom::Point knotpoint);
+ void _prepareLabelRenderer(Gtk::TreeModel::const_iterator const &row);
+
+ bool _handleKeyEvent(GdkEventKey *event);
+ void _handleButtonEvent(GdkEventButton *event);
+
+ friend class Inkscape::LivePathEffect::
+ FilletChamferPointArrayParamKnotHolderEntity;
+
+private:
+ FilletChamferPropertiesDialog(
+ FilletChamferPropertiesDialog const &); // no copy
+ FilletChamferPropertiesDialog &operator=(
+ FilletChamferPropertiesDialog const &); // no assign
+};
+
+} // namespace
+} // namespace
+} // namespace
+
+#endif //INKSCAPE_DIALOG_LAYER_PROPERTIES_H
+
+/*
+ Local Variables:
+ mode:c++
+ c-file-style:"stroustrup"
+ c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
+ indent-tabs-mode:nil
+ fill-column:99
+ End:
+*/
+// vim:
+// filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99
+// :
diff --git a/src/ui/dialog/lpe-powerstroke-properties.cpp b/src/ui/dialog/lpe-powerstroke-properties.cpp
new file mode 100644
index 000000000..c34351511
--- /dev/null
+++ b/src/ui/dialog/lpe-powerstroke-properties.cpp
@@ -0,0 +1,211 @@
+/**
+ * @file
+ * Dialog for renaming layers.
+ */
+/* Author:
+ * Bryce W. Harrington <bryce@bryceharrington.com>
+ * Andrius R. <knutux@gmail.com>
+ * Abhishek Sharma
+ *
+ * Copyright (C) 2004 Bryce Harrington
+ * Copyright (C) 2006 Andrius R.
+ *
+ * Released under GNU GPL. Read the file 'COPYING' for more information
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#if GLIBMM_DISABLE_DEPRECATED && HAVE_GLIBMM_THREADS_H
+#include <glibmm/threads.h>
+#endif
+
+#include "lpe-powerstroke-properties.h"
+#include <boost/lexical_cast.hpp>
+#include <gtkmm/stock.h>
+#include <glibmm/main.h>
+#include <glibmm/i18n.h>
+#include "inkscape.h"
+#include "desktop.h"
+#include "document.h"
+#include "document-undo.h"
+#include "layer-manager.h"
+#include "message-stack.h"
+#include "desktop-handles.h"
+#include "sp-object.h"
+#include "sp-item.h"
+#include "verbs.h"
+#include "selection.h"
+#include "selection-chemistry.h"
+#include "ui/icon-names.h"
+#include "ui/widget/imagetoggler.h"
+//#include "event-context.h"
+
+namespace Inkscape {
+namespace UI {
+namespace Dialogs {
+
+PowerstrokePropertiesDialog::PowerstrokePropertiesDialog()
+: _desktop(NULL), _knotpoint(NULL), _position_visible(false)
+{
+ Gtk::Box *mainVBox = get_vbox();
+
+ _layout_table.set_spacings(4);
+ _layout_table.resize (2, 2);
+
+ // Layer name widgets
+ _powerstroke_position_entry.set_activates_default(true);
+ _powerstroke_position_label.set_label(_("Position:"));
+ _powerstroke_position_label.set_alignment(1.0, 0.5);
+
+ _powerstroke_width_entry.set_activates_default(true);
+ _powerstroke_width_label.set_label(_("Width:"));
+ _powerstroke_width_label.set_alignment(1.0, 0.5);
+
+ _layout_table.attach(_powerstroke_position_label,
+ 0, 1, 0, 1, Gtk::FILL, Gtk::FILL);
+ _layout_table.attach(_powerstroke_position_entry,
+ 1, 2, 0, 1, Gtk::FILL | Gtk::EXPAND, Gtk::FILL);
+
+ _layout_table.attach(_powerstroke_width_label, 0, 1, 1, 2, Gtk::FILL, Gtk::FILL);
+ _layout_table.attach(_powerstroke_width_entry, 1, 2, 1, 2, Gtk::FILL | Gtk::EXPAND, Gtk::FILL);
+
+ mainVBox->pack_start(_layout_table, true, true, 4);
+
+ // Buttons
+ _close_button.set_use_stock(true);
+ _close_button.set_label(Gtk::Stock::CANCEL.id);
+ _close_button.set_can_default();
+
+ _apply_button.set_use_underline(true);
+ _apply_button.set_can_default();
+
+ _close_button.signal_clicked()
+ .connect(sigc::mem_fun(*this, &PowerstrokePropertiesDialog::_close));
+ _apply_button.signal_clicked()
+ .connect(sigc::mem_fun(*this, &PowerstrokePropertiesDialog::_apply));
+
+ signal_delete_event().connect(
+ sigc::bind_return(
+ sigc::hide(sigc::mem_fun(*this, &PowerstrokePropertiesDialog::_close)),
+ true
+ )
+ );
+
+ add_action_widget(_close_button, Gtk::RESPONSE_CLOSE);
+ add_action_widget(_apply_button, Gtk::RESPONSE_APPLY);
+
+ _apply_button.grab_default();
+
+ show_all_children();
+
+ set_focus(_powerstroke_width_entry);
+}
+
+PowerstrokePropertiesDialog::~PowerstrokePropertiesDialog() {
+
+ _setDesktop(NULL);
+}
+
+void PowerstrokePropertiesDialog::showDialog(SPDesktop *desktop, Geom::Point knotpoint, const Inkscape::LivePathEffect::PowerStrokePointArrayParamKnotHolderEntity *pt)
+{
+ PowerstrokePropertiesDialog *dialog = new PowerstrokePropertiesDialog();
+
+ dialog->_setDesktop(desktop);
+ dialog->_setKnotPoint(knotpoint);
+ dialog->_setPt(pt);
+
+ dialog->set_title(_("Modify Node Position"));
+ dialog->_apply_button.set_label(_("_Move"));
+
+ dialog->set_modal(true);
+ desktop->setWindowTransient (dialog->gobj());
+ dialog->property_destroy_with_parent() = true;
+
+ dialog->show();
+ dialog->present();
+}
+
+void
+PowerstrokePropertiesDialog::_apply()
+{
+ std::istringstream i_pos(_powerstroke_position_entry.get_text());
+ std::istringstream i_width(_powerstroke_width_entry.get_text());
+ double d_pos, d_width;
+ if ((i_pos >> d_pos) && i_width >> d_width) {
+ _knotpoint->knot_set_offset(Geom::Point(d_pos, d_width));
+ }
+ _close();
+}
+
+void
+PowerstrokePropertiesDialog::_close()
+{
+ _setDesktop(NULL);
+ destroy_();
+ Glib::signal_idle().connect(
+ sigc::bind_return(
+ sigc::bind(sigc::ptr_fun(&::operator delete), this),
+ false
+ )
+ );
+}
+
+bool PowerstrokePropertiesDialog::_handleKeyEvent(GdkEventKey *event)
+{
+
+ /*switch (get_group0_keyval(event)) {
+ case GDK_KEY_Return:
+ case GDK_KEY_KP_Enter: {
+ _apply();
+ return true;
+ }
+ break;
+ }*/
+ return false;
+}
+
+void PowerstrokePropertiesDialog::_handleButtonEvent(GdkEventButton* event)
+{
+ if ( (event->type == GDK_2BUTTON_PRESS) && (event->button == 1) ) {
+ _apply();
+ }
+}
+
+void PowerstrokePropertiesDialog::_setKnotPoint(Geom::Point knotpoint)
+{
+ _powerstroke_position_entry.set_text(boost::lexical_cast<std::string>(knotpoint.x()));
+ _powerstroke_width_entry.set_text(boost::lexical_cast<std::string>(knotpoint.y()));
+}
+
+void PowerstrokePropertiesDialog::_setPt(const Inkscape::LivePathEffect::PowerStrokePointArrayParamKnotHolderEntity *pt)
+{
+ _knotpoint = const_cast<Inkscape::LivePathEffect::PowerStrokePointArrayParamKnotHolderEntity *>(pt);
+}
+
+void PowerstrokePropertiesDialog::_setDesktop(SPDesktop *desktop) {
+ if (desktop) {
+ Inkscape::GC::anchor (desktop);
+ }
+ if (_desktop) {
+ Inkscape::GC::release (_desktop);
+ }
+ _desktop = desktop;
+}
+
+} // namespace
+} // namespace
+} // namespace
+
+
+/*
+ Local Variables:
+ mode:c++
+ c-file-style:"stroustrup"
+ c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
+ indent-tabs-mode:nil
+ fill-column:99
+ End:
+*/
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :
diff --git a/src/ui/dialog/lpe-powerstroke-properties.h b/src/ui/dialog/lpe-powerstroke-properties.h
new file mode 100644
index 000000000..c53eac0d9
--- /dev/null
+++ b/src/ui/dialog/lpe-powerstroke-properties.h
@@ -0,0 +1,99 @@
+/** @file
+ * @brief Dialog for renaming layers
+ */
+/* Author:
+ * Bryce W. Harrington <bryce@bryceharrington.com>
+ *
+ * Copyright (C) 2004 Bryce Harrington
+ *
+ * Released under GNU GPL. Read the file 'COPYING' for more information
+ */
+
+#ifndef INKSCAPE_DIALOG_POWERSTROKE_PROPERTIES_H
+#define INKSCAPE_DIALOG_POWERSTROKE_PROPERTIES_H
+
+#include <2geom/point.h>
+#include <gtkmm/dialog.h>
+#include <gtkmm/entry.h>
+#include <gtkmm/label.h>
+#include <gtkmm/table.h>
+#include <gtkmm/combobox.h>
+#include <gtkmm/liststore.h>
+#include <gtkmm/treeview.h>
+#include <gtkmm/treestore.h>
+#include <gtkmm/scrolledwindow.h>
+#include "live_effects/parameter/powerstrokepointarray.h"
+
+class SPDesktop;
+
+namespace Inkscape {
+namespace UI {
+namespace Dialogs {
+
+class PowerstrokePropertiesDialog : public Gtk::Dialog {
+ public:
+ PowerstrokePropertiesDialog();
+ virtual ~PowerstrokePropertiesDialog();
+
+ Glib::ustring getName() const { return "LayerPropertiesDialog"; }
+
+ static void showDialog(SPDesktop *desktop, Geom::Point knotpoint, const Inkscape::LivePathEffect::PowerStrokePointArrayParamKnotHolderEntity *pt);
+
+protected:
+
+ SPDesktop *_desktop;
+ Inkscape::LivePathEffect::PowerStrokePointArrayParamKnotHolderEntity *_knotpoint;
+
+ Gtk::Label _powerstroke_position_label;
+ Gtk::Entry _powerstroke_position_entry;
+ Gtk::Label _powerstroke_width_label;
+ Gtk::Entry _powerstroke_width_entry;
+ Gtk::Table _layout_table;
+ bool _position_visible;
+
+ Gtk::Button _close_button;
+ Gtk::Button _apply_button;
+
+ sigc::connection _destroy_connection;
+
+ static PowerstrokePropertiesDialog &_instance() {
+ static PowerstrokePropertiesDialog instance;
+ return instance;
+ }
+
+ void _setDesktop(SPDesktop *desktop);
+ void _setPt(const Inkscape::LivePathEffect::PowerStrokePointArrayParamKnotHolderEntity *pt);
+
+ void _apply();
+ void _close();
+
+ void _setKnotPoint(Geom::Point knotpoint);
+ void _prepareLabelRenderer(Gtk::TreeModel::const_iterator const &row);
+
+ bool _handleKeyEvent(GdkEventKey *event);
+ void _handleButtonEvent(GdkEventButton* event);
+
+ friend class Inkscape::LivePathEffect::PowerStrokePointArrayParamKnotHolderEntity;
+
+private:
+ PowerstrokePropertiesDialog(PowerstrokePropertiesDialog const &); // no copy
+ PowerstrokePropertiesDialog &operator=(PowerstrokePropertiesDialog const &); // no assign
+};
+
+} // namespace
+} // namespace
+} // namespace
+
+
+#endif //INKSCAPE_DIALOG_LAYER_PROPERTIES_H
+
+/*
+ Local Variables:
+ mode:c++
+ c-file-style:"stroustrup"
+ c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
+ indent-tabs-mode:nil
+ fill-column:99
+ End:
+*/
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :
diff --git a/src/ui/dialog/new-from-template.cpp b/src/ui/dialog/new-from-template.cpp
index f326bb3ee..e30b148bb 100644
--- a/src/ui/dialog/new-from-template.cpp
+++ b/src/ui/dialog/new-from-template.cpp
@@ -8,6 +8,9 @@
* Released under GNU GPL, read the file 'COPYING' for more information
*/
+#if HAVE_CONFIG_H
+ #include "config.h"
+#endif
#include "new-from-template.h"
#include "file.h"
@@ -25,12 +28,22 @@ NewFromTemplate::NewFromTemplate()
{
set_title(_("New From Template"));
resize(400, 400);
-
+
+#if WITH_GTKMM_3_0
+ get_content_area()->pack_start(_main_widget);
+#else
get_vbox()->pack_start(_main_widget);
+#endif
Gtk::Alignment *align;
align = Gtk::manage(new Gtk::Alignment(Gtk::ALIGN_END, Gtk::ALIGN_CENTER, 0.0, 0.0));
+
+#if WITH_GTKMM_3_0
+ get_content_area()->pack_end(*align, Gtk::PACK_SHRINK);
+#else
get_vbox()->pack_end(*align, Gtk::PACK_SHRINK);
+#endif
+
align->set_padding(0, 0, 0, 15);
align->add(_create_template_button);
diff --git a/src/ui/dialog/objects.cpp b/src/ui/dialog/objects.cpp
new file mode 100644
index 000000000..93d5dfbd5
--- /dev/null
+++ b/src/ui/dialog/objects.cpp
@@ -0,0 +1,2144 @@
+/*
+ * A simple panel for objects
+ *
+ * Authors:
+ * Theodore Janeczko
+ * Tweaked by Liam P White for use in Inkscape
+ *
+ * Copyright (C) Theodore Janeczko 2012 <flutterguy317@gmail.com>
+ *
+ * Released under GNU GPL, read the file 'COPYING' for more information
+ */
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include "objects.h"
+#include <gtkmm/widget.h>
+#include <gtkmm/icontheme.h>
+#include <gtkmm/imagemenuitem.h>
+#include <gtkmm/separatormenuitem.h>
+#include <gtkmm/stock.h>
+
+#include <glibmm/i18n.h>
+#include <glibmm/main.h>
+
+#include "desktop.h"
+#include "desktop-style.h"
+#include "ui/dialog-events.h"
+#include "document.h"
+#include "document-undo.h"
+#include "filter-chemistry.h"
+#include "filters/blend.h"
+#include "filters/gaussian-blur.h"
+#include "helper/action.h"
+#include "inkscape.h"
+#include "layer-manager.h"
+#include "preferences.h"
+#include "selection.h"
+#include "sp-clippath.h"
+#include "sp-mask.h"
+#include "sp-item.h"
+#include "sp-object.h"
+#include "sp-root.h"
+#include "sp-shape.h"
+#include "style.h"
+#include "ui/tools-switch.h"
+#include "ui/icon-names.h"
+#include "ui/widget/imagetoggler.h"
+#include "ui/widget/layertypeicon.h"
+#include "ui/widget/insertordericon.h"
+#include "ui/widget/clipmaskicon.h"
+#include "ui/widget/highlight-picker.h"
+#include "ui/tools/node-tool.h"
+#include "ui/tools/tool-base.h"
+#include "verbs.h"
+#include "widgets/sp-color-notebook.h"
+#include "widgets/icon.h"
+#include "xml/node.h"
+#include "xml/node-observer.h"
+#include "xml/repr.h"
+
+//#define DUMP_LAYERS 1
+
+namespace Inkscape {
+namespace UI {
+namespace Dialog {
+
+using Inkscape::XML::Node;
+
+/**
+ * Gets an instance of the Objects panel
+ */
+ObjectsPanel& ObjectsPanel::getInstance()
+{
+ return *new ObjectsPanel();
+}
+
+/**
+ * Column enumeration
+ */
+enum {
+ COL_VISIBLE = 1,
+ COL_LOCKED,
+ COL_TYPE,
+// COL_INSERTORDER,
+ COL_CLIPMASK,
+ COL_HIGHLIGHT
+};
+
+/**
+ * Button enumeration
+ */
+enum {
+ BUTTON_NEW = 0,
+ BUTTON_RENAME,
+ BUTTON_TOP,
+ BUTTON_BOTTOM,
+ BUTTON_UP,
+ BUTTON_DOWN,
+ BUTTON_DUPLICATE,
+ BUTTON_DELETE,
+ BUTTON_SOLO,
+ BUTTON_SHOW_ALL,
+ BUTTON_HIDE_ALL,
+ BUTTON_LOCK_OTHERS,
+ BUTTON_LOCK_ALL,
+ BUTTON_UNLOCK_ALL,
+ BUTTON_SETCLIP,
+ BUTTON_CLIPGROUP,
+// BUTTON_SETINVCLIP,
+ BUTTON_UNSETCLIP,
+ BUTTON_SETMASK,
+ BUTTON_UNSETMASK,
+ BUTTON_GROUP,
+ BUTTON_UNGROUP,
+ BUTTON_COLLAPSE_ALL,
+ DRAGNDROP
+};
+
+/**
+ * Xml node observer for observing objects in the document
+ */
+class ObjectsPanel::ObjectWatcher : public Inkscape::XML::NodeObserver {
+public:
+ /**
+ * Creates a new object watcher
+ * @param pnl The panel to which the object watcher belongs
+ * @param obj The object to watch
+ */
+ ObjectWatcher(ObjectsPanel* pnl, SPObject* obj) :
+ _pnl(pnl),
+ _obj(obj),
+ _repr(obj->getRepr()),
+ _highlightAttr(g_quark_from_string("inkscape:highlight-color")),
+ _lockedAttr(g_quark_from_string("sodipodi:insensitive")),
+ _labelAttr(g_quark_from_string("inkscape:label")),
+ _groupAttr(g_quark_from_string("inkscape:groupmode")),
+ _styleAttr(g_quark_from_string("style")),
+ _clipAttr(g_quark_from_string("clip-path")),
+ _maskAttr(g_quark_from_string("mask"))
+ {}
+
+ virtual void notifyChildAdded( Node &/*node*/, Node &/*child*/, Node */*prev*/ )
+ {
+ if ( _pnl && _obj ) {
+ _pnl->_objectsChanged( _obj );
+ }
+ }
+ virtual void notifyChildRemoved( Node &/*node*/, Node &/*child*/, Node */*prev*/ )
+ {
+ if ( _pnl && _obj ) {
+ _pnl->_objectsChanged( _obj );
+ }
+ }
+ virtual void notifyChildOrderChanged( Node &/*node*/, Node &/*child*/, Node */*old_prev*/, Node */*new_prev*/ )
+ {
+ if ( _pnl && _obj ) {
+ _pnl->_objectsChanged( _obj );
+ }
+ }
+ virtual void notifyContentChanged( Node &/*node*/, Util::ptr_shared<char> /*old_content*/, Util::ptr_shared<char> /*new_content*/ ) {}
+ virtual void notifyAttributeChanged( Node &/*node*/, GQuark name, Util::ptr_shared<char> /*old_value*/, Util::ptr_shared<char> /*new_value*/ ) {
+ if ( _pnl && _obj ) {
+ if ( name == _lockedAttr || name == _labelAttr || name == _highlightAttr || name == _groupAttr || name == _styleAttr || name == _clipAttr || name == _maskAttr ) {
+ _pnl->_updateObject(_obj, name == _highlightAttr);
+ if ( name == _styleAttr ) {
+ _pnl->_updateComposite();
+ }
+ }
+ }
+ }
+
+ /**
+ * Objects panel to which this watcher belongs
+ */
+ ObjectsPanel* _pnl;
+
+ /**
+ * The object that is being observed
+ */
+ SPObject* _obj;
+
+ /**
+ * The xml representation of the object that is being observed
+ */
+ Inkscape::XML::Node* _repr;
+
+ /* These are quarks which define the attributes that we are observing */
+ GQuark _highlightAttr;
+ GQuark _lockedAttr;
+ GQuark _labelAttr;
+ GQuark _groupAttr;
+ GQuark _styleAttr;
+ GQuark _clipAttr;
+ GQuark _maskAttr;
+};
+
+class ObjectsPanel::InternalUIBounce
+{
+public:
+ int _actionCode;
+};
+
+class ObjectsPanel::ModelColumns : public Gtk::TreeModel::ColumnRecord
+{
+public:
+
+ ModelColumns()
+ {
+ add(_colObject);
+ add(_colVisible);
+ add(_colLocked);
+ add(_colLabel);
+ add(_colType);
+ add(_colHighlight);
+ add(_colClipMask);
+ //add(_colInsertOrder);
+ }
+ virtual ~ModelColumns() {}
+
+ Gtk::TreeModelColumn<SPItem*> _colObject;
+ Gtk::TreeModelColumn<Glib::ustring> _colLabel;
+ Gtk::TreeModelColumn<bool> _colVisible;
+ Gtk::TreeModelColumn<bool> _colLocked;
+ Gtk::TreeModelColumn<int> _colType;
+ Gtk::TreeModelColumn<guint32> _colHighlight;
+ Gtk::TreeModelColumn<int> _colClipMask;
+ //Gtk::TreeModelColumn<int> _colInsertOrder;
+};
+
+/**
+ * Stylizes a button using the given icon name and tooltip
+ */
+void ObjectsPanel::_styleButton( Gtk::Button& btn, char const* iconName, char const* tooltip )
+{
+ GtkWidget *child = sp_icon_new( Inkscape::ICON_SIZE_SMALL_TOOLBAR, iconName );
+ gtk_widget_show( child );
+ btn.add( *Gtk::manage(Glib::wrap(child)) );
+ btn.set_relief(Gtk::RELIEF_NONE);
+
+ btn.set_tooltip_text (tooltip);
+
+}
+
+/**
+ * Adds an item to the pop-up (right-click) menu
+ * @param desktop The active destktop
+ * @param code Action code
+ * @param iconName Icon name
+ * @param fallback Fallback text
+ * @param id Button id for callback function
+ * @return The generated menu item
+ */
+Gtk::MenuItem& ObjectsPanel::_addPopupItem( SPDesktop *desktop, unsigned int code, char const* iconName, char const* fallback, int id )
+{
+ GtkWidget* iconWidget = 0;
+ const char* label = 0;
+
+ if ( iconName ) {
+ iconWidget = sp_icon_new( Inkscape::ICON_SIZE_MENU, iconName );
+ }
+
+ if ( desktop ) {
+ Verb *verb = Verb::get( code );
+ if ( verb ) {
+ SPAction *action = verb->get_action(desktop);
+ if ( !iconWidget && action && action->image ) {
+ iconWidget = sp_icon_new( Inkscape::ICON_SIZE_MENU, action->image );
+ }
+
+ if ( action ) {
+ // label = action->name;
+ }
+ }
+ }
+
+ if ( !label && fallback ) {
+ label = fallback;
+ }
+
+ Gtk::Widget* wrapped = 0;
+ if ( iconWidget ) {
+ wrapped = Gtk::manage(Glib::wrap(iconWidget));
+ wrapped->show();
+ }
+
+
+ Gtk::MenuItem* item = 0;
+
+ if (wrapped) {
+ item = Gtk::manage(new Gtk::ImageMenuItem(*wrapped, label, true));
+ } else {
+ item = Gtk::manage(new Gtk::MenuItem(label, true));
+ }
+
+ item->signal_activate().connect(sigc::bind(sigc::mem_fun(*this, &ObjectsPanel::_takeAction), id));
+ _popupMenu.append(*item);
+
+ return *item;
+}
+
+/**
+ * Callback function for when an object changes. Essentially refreshes the entire tree
+ * @param obj Object which was changed (currently not used as the entire tree is recreated)
+ */
+void ObjectsPanel::_objectsChanged(SPObject */*obj*/)
+{
+ //First, unattach the watchers
+ while (!_objectWatchers.empty())
+ {
+ ObjectsPanel::ObjectWatcher *w = _objectWatchers.back();
+ w->_repr->removeObserver(*w);
+ _objectWatchers.pop_back();
+ delete w;
+ }
+
+ if (_desktop) {
+ //Get the current document's root and use that to enumerate the tree
+ SPDocument* document = _desktop->doc();
+ SPRoot* root = document->getRoot();
+ if ( root ) {
+ _selectedConnection.block();
+ //Clear the tree store
+ _store->clear();
+ //Add all items recursively
+ _addObject( root, 0 );
+ _selectedConnection.unblock();
+ //Set the tree selection
+ _objectsSelected(_desktop->selection);
+ //Handle button sensitivity
+ _checkTreeSelection();
+ }
+ }
+}
+
+/**
+ * Recursively adds the children of the given item to the tree
+ * @param obj Root object to add to the tree
+ * @param parentRow Parent tree row (or NULL if adding to tree root)
+ */
+void ObjectsPanel::_addObject(SPObject* obj, Gtk::TreeModel::Row* parentRow)
+{
+ if ( _desktop && obj ) {
+ for ( SPObject *child = obj->children; child != NULL; child = child->next) {
+
+ if (SP_IS_ITEM(child))
+ {
+ SPItem * item = SP_ITEM(child);
+ SPGroup * group = SP_IS_GROUP(child) ? SP_GROUP(child) : 0;
+
+ //Add the item to the tree and set the column information
+ Gtk::TreeModel::iterator iter = parentRow ? _store->prepend(parentRow->children()) : _store->prepend();
+ Gtk::TreeModel::Row row = *iter;
+ row[_model->_colObject] = item;
+ //this seems to crash on convert stroke to path then undo (probably no ID?)
+ try {
+ row[_model->_colLabel] = item->label() ? item->label() : item->getId();
+ } catch (...) {
+ row[_model->_colLabel] = Glib::ustring("getId_failure");
+ g_critical("item->getId() failed, using \"getId_failure\"");
+ }
+ row[_model->_colVisible] = !item->isHidden();
+ row[_model->_colLocked] = !item->isSensitive();
+ row[_model->_colType] = group ? (group->layerMode() == SPGroup::LAYER ? 2 : 1) : 0;
+ row[_model->_colHighlight] = item->isHighlightSet() ? item->highlight_color() : item->highlight_color() & 0xffffff00;
+ row[_model->_colClipMask] = item->clip_ref && item->clip_ref->getObject() ? 1 : (item->mask_ref && item->mask_ref->getObject() ? 2 : 0);
+ //row[_model->_colInsertOrder] = group ? (group->insertBottom() ? 2 : 1) : 0;
+
+ //If our parent object is a group and it's expanded, expand the tree
+ if (SP_IS_GROUP(obj) && SP_GROUP(obj)->expanded())
+ {
+ _tree.expand_to_path( _store->get_path(iter) );
+ }
+
+ //Add an object watcher to the item
+ ObjectsPanel::ObjectWatcher *w = new ObjectsPanel::ObjectWatcher(this, child);
+ child->getRepr()->addObserver(*w);
+ _objectWatchers.push_back(w);
+
+ //If the item is a group, recursively add its children
+ if (group)
+ {
+ _addObject( child, &row );
+ }
+ }
+ }
+ }
+}
+
+/**
+ * Updates an item in the tree and optionally recursively updates the item's children
+ * @param obj The item to update in the tree
+ * @param recurse Whether to recurse through the item's children
+ */
+void ObjectsPanel::_updateObject( SPObject *obj, bool recurse ) {
+ //Find the object in the tree store and update it
+
+ //mark
+ _store->foreach_iter( sigc::bind<SPObject*>(sigc::mem_fun(*this, &ObjectsPanel::_checkForUpdated), obj) );
+ //end mark
+ if (recurse)
+ {
+ for (SPObject * iter = obj->children; iter != NULL; iter = iter->next)
+ {
+ _updateObject(iter, recurse);
+ }
+ }
+}
+
+/**
+ * Checks items in the tree store and updates the given item
+ * @param iter Current item being looked at in the tree
+ * @param obj Object to update
+ * @return
+ */
+bool ObjectsPanel::_checkForUpdated(const Gtk::TreeIter& iter, SPObject* obj)
+{
+ Gtk::TreeModel::Row row = *iter;
+ if ( obj == row[_model->_colObject] )
+ {
+ //We found our item in the tree!! Update it!
+ SPItem * item = SP_IS_ITEM(obj) ? SP_ITEM(obj) : 0;
+ SPGroup * group = SP_IS_GROUP(obj) ? SP_GROUP(obj) : 0;
+
+ row[_model->_colLabel] = obj->label() ? obj->label() : obj->getId();
+ row[_model->_colVisible] = item ? !item->isHidden() : false;
+ row[_model->_colLocked] = item ? !item->isSensitive() : false;
+ row[_model->_colType] = group ? (group->layerMode() == SPGroup::LAYER ? 2 : 1) : 0;
+ row[_model->_colHighlight] = item ? (item->isHighlightSet() ? item->highlight_color() : item->highlight_color() & 0xffffff00) : 0;
+ row[_model->_colClipMask] = item ? (item->clip_ref && item->clip_ref->getObject() ? 1 : (item->mask_ref && item->mask_ref->getObject() ? 2 : 0)) : 0;
+ //row[_model->_colInsertOrder] = group ? (group->insertBottom() ? 2 : 1) : 0;
+
+ return true;
+ }
+
+ return false;
+}
+
+/**
+ * Updates the composite controls for the selected item
+ */
+void ObjectsPanel::_updateComposite() {
+ if (!_blockCompositeUpdate)
+ {
+ //Set the default values
+ bool setValues = true;
+
+ //Get/set the values
+ _tree.get_selection()->selected_foreach_iter(sigc::bind<bool *>(sigc::mem_fun(*this, &ObjectsPanel::_compositingChanged), &setValues));
+ }
+}
+
+/**
+ * Sets the compositing values for the first selected item in the tree
+ * @param iter Current tree item
+ * @param setValues Whether to set the compositing values
+ * @param blur Blur value to use
+ */
+void ObjectsPanel::_compositingChanged( const Gtk::TreeModel::iterator& iter, bool *setValues )
+{
+ if (iter) {
+ Gtk::TreeModel::Row row = *iter;
+ SPItem *item = row[_model->_colObject];
+ if (*setValues)
+ {
+ _setCompositingValues(item);
+ *setValues = false;
+ }
+ }
+}
+
+/**
+ * Occurs when the current desktop selection changes
+ * @param sel The current selection
+ */
+void ObjectsPanel::_objectsSelected( Selection *sel ) {
+
+ bool setOpacity = true;
+ _selectedConnection.block();
+ _tree.get_selection()->unselect_all();
+ SPItem *item = NULL;
+ for (const GSList * iter = sel->itemList(); iter != NULL; iter = iter->next)
+ {
+ item = reinterpret_cast<SPItem *>(iter->data);
+ if (setOpacity)
+ {
+ _setCompositingValues(item);
+ setOpacity = false;
+ }
+ _store->foreach(sigc::bind<SPItem *, bool>( sigc::mem_fun(*this, &ObjectsPanel::_checkForSelected), item, iter->next == NULL));
+ }
+ if (!item) {
+ if (_desktop->currentLayer() && SP_IS_ITEM(_desktop->currentLayer())) {
+ item = SP_ITEM(_desktop->currentLayer());
+ _setCompositingValues(item);
+ _store->foreach(sigc::bind<SPItem *, bool>( sigc::mem_fun(*this, &ObjectsPanel::_checkForSelected), item, true));
+ }
+ }
+ _selectedConnection.unblock();
+ _checkTreeSelection();
+}
+
+/**
+ * Helper function for setting the compositing values
+ * @param item Item to use for setting the compositing values
+ */
+void ObjectsPanel::_setCompositingValues(SPItem *item)
+{
+ //Block the connections to avoid interference
+ _opacityConnection.block();
+ _blendConnection.block();
+ _blurConnection.block();
+
+ //Set the opacity
+#if WITH_GTKMM_3_0
+ _opacity_adjustment->set_value((item->style->opacity.set ? SP_SCALE24_TO_FLOAT(item->style->opacity.value) : 1) * _opacity_adjustment->get_upper());
+#else
+ _opacity_adjustment.set_value((item->style->opacity.set ? SP_SCALE24_TO_FLOAT(item->style->opacity.value) : 1) * _opacity_adjustment.get_upper());
+#endif
+ SPFeBlend *spblend = NULL;
+ SPGaussianBlur *spblur = NULL;
+ if (item->style->getFilter())
+ {
+ for(SPObject *primitive_obj = item->style->getFilter()->children; primitive_obj && SP_IS_FILTER_PRIMITIVE(primitive_obj); primitive_obj = primitive_obj->next) {
+ if(SP_IS_FEBLEND(primitive_obj) && !spblend) {
+ //Get the blend mode
+ spblend = SP_FEBLEND(primitive_obj);
+ }
+
+ if(SP_IS_GAUSSIANBLUR(primitive_obj) && !spblur) {
+ //Get the blur value
+ spblur = SP_GAUSSIANBLUR(primitive_obj);
+ }
+ }
+ }
+
+ //Set the blend mode
+ _fe_cb.set_blend_mode(spblend ? spblend->blend_mode : Inkscape::Filters::BLEND_NORMAL);
+
+ //Set the blur value
+ Geom::OptRect bbox = item->bounds(SPItem::GEOMETRIC_BBOX);
+ if (bbox && spblur) {
+ double perimeter = bbox->dimensions()[Geom::X] + bbox->dimensions()[Geom::Y]; // fixme: this is only half the perimeter, is that correct?
+ _fe_blur.set_blur_value(spblur->stdDeviation.getNumber() * 400 / perimeter);
+ } else {
+ _fe_blur.set_blur_value(0);
+ }
+
+ //Unblock connections
+ _blurConnection.unblock();
+ _blendConnection.unblock();
+ _opacityConnection.unblock();
+}
+
+/**
+ * Checks the tree and selects the specified item, optionally scrolling to the item
+ * @param path Current tree path
+ * @param iter Current tree item
+ * @param item Item to select in the tree
+ * @param scrollto Whether to scroll to the item
+ * @return Whether to continue searching the tree
+ */
+bool ObjectsPanel::_checkForSelected(const Gtk::TreePath &path, const Gtk::TreeIter& iter, SPItem* item, bool scrollto)
+{
+ bool stopGoing = false;
+
+ Gtk::TreeModel::Row row = *iter;
+ if ( item == row[_model->_colObject] )
+ {
+ //We found the item! Expand to the path and select it in the tree.
+ _tree.expand_to_path( path );
+
+ Glib::RefPtr<Gtk::TreeSelection> select = _tree.get_selection();
+
+ select->select(iter);
+ if (scrollto) {
+ //Scroll to the item in the tree
+ _tree.scroll_to_row(path);
+ }
+
+ stopGoing = true;
+ }
+
+ return stopGoing;
+}
+
+/**
+ * Pushes the current tree selection to the canvas
+ */
+void ObjectsPanel::_pushTreeSelectionToCurrent()
+{
+ if ( _desktop && _desktop->currentRoot() ) {
+ //block connections for selection and compositing values to prevent interference
+ _selectionChangedConnection.block();
+
+ //Clear the selection and then iterate over the tree selection, pushing each item to the desktop
+ _desktop->selection->clear();
+ bool setOpacity = true;
+ _tree.get_selection()->selected_foreach_iter( sigc::bind<bool *>(sigc::mem_fun(*this, &ObjectsPanel::_selected_row_callback), &setOpacity));
+ //unblock connections
+ _selectionChangedConnection.unblock();
+
+ _checkTreeSelection();
+ }
+}
+
+/**
+ * Helper function for pushing the current tree selection to the current desktop
+ * @param iter Current tree item
+ * @param setCompositingValues Whether to set the compositing values
+ * @param blur
+ */
+void ObjectsPanel::_selected_row_callback( const Gtk::TreeModel::iterator& iter, bool *setCompositingValues )
+{
+ if (iter) {
+ Gtk::TreeModel::Row row = *iter;
+ SPItem *item = row[_model->_colObject];
+ if (!SP_IS_GROUP(item) || SP_GROUP(item)->layerMode() != SPGroup::LAYER)
+ {
+ //If the item is not a layer, then select it and set the current layer to its parent (if it's the first item)
+ if (_desktop->selection->isEmpty()) _desktop->setCurrentLayer(item->parent);
+ _desktop->selection->add(item);
+ }
+ else
+ {
+ //If the item is a layer, set the current layer
+ if (_desktop->selection->isEmpty()) _desktop->setCurrentLayer(item);
+ }
+ if (*setCompositingValues)
+ {
+ //Only set the compositing values for the first item
+ _setCompositingValues(item);
+ *setCompositingValues = false;
+ }
+ }
+}
+
+/**
+ * Handles button sensitivity
+ */
+void ObjectsPanel::_checkTreeSelection()
+{
+ bool sensitive = _tree.get_selection()->count_selected_rows() > 0;
+ //TODO: top/bottom sensitivity
+ bool sensitiveNonTop = true;
+ bool sensitiveNonBottom = true;
+
+ for ( std::vector<Gtk::Widget*>::iterator it = _watching.begin(); it != _watching.end(); ++it ) {
+ (*it)->set_sensitive( sensitive );
+ }
+ for ( std::vector<Gtk::Widget*>::iterator it = _watchingNonTop.begin(); it != _watchingNonTop.end(); ++it ) {
+ (*it)->set_sensitive( sensitiveNonTop );
+ }
+ for ( std::vector<Gtk::Widget*>::iterator it = _watchingNonBottom.begin(); it != _watchingNonBottom.end(); ++it ) {
+ (*it)->set_sensitive( sensitiveNonBottom );
+ }
+}
+
+/**
+ * Sets visibility of items in the tree
+ * @param iter Current item in the tree
+ * @param visible Whether the item should be visible or not
+ */
+void ObjectsPanel::_setVisibleIter( const Gtk::TreeModel::iterator& iter, const bool visible )
+{
+ Gtk::TreeModel::Row row = *iter;
+ SPItem* item = row[_model->_colObject];
+ if (item)
+ {
+ item->setHidden( !visible );
+ row[_model->_colVisible] = visible;
+ item->updateRepr(SP_OBJECT_WRITE_NO_CHILDREN | SP_OBJECT_WRITE_EXT);
+ }
+}
+
+/**
+ * Sets sensitivity of items in the tree
+ * @param iter Current item in the tree
+ * @param locked Whether the item should be locked
+ */
+void ObjectsPanel::_setLockedIter( const Gtk::TreeModel::iterator& iter, const bool locked )
+{
+ Gtk::TreeModel::Row row = *iter;
+ SPItem* item = row[_model->_colObject];
+ if (item)
+ {
+ item->setLocked( locked );
+ row[_model->_colLocked] = locked;
+ item->updateRepr(SP_OBJECT_WRITE_NO_CHILDREN | SP_OBJECT_WRITE_EXT);
+ }
+}
+
+/**
+ * Handles keyboard events
+ * @param event Keyboard event passed in from GDK
+ * @return Whether the event should be eaten (om nom nom)
+ */
+bool ObjectsPanel::_handleKeyEvent(GdkEventKey *event)
+{
+
+ bool empty = _desktop->selection->isEmpty();
+
+ switch (Inkscape::UI::Tools::get_group0_keyval(event)) {
+ case GDK_KEY_Return:
+ case GDK_KEY_KP_Enter:
+ case GDK_KEY_F2:
+ {
+ Gtk::TreeModel::iterator iter = _tree.get_selection()->get_selected();
+ if (iter && !_text_renderer->property_editable()) {
+ //Rename item
+ Gtk::TreeModel::Path *path = new Gtk::TreeModel::Path(iter);
+ _text_renderer->property_editable() = true;
+ _tree.set_cursor(*path, *_name_column, true);
+ grab_focus();
+ return true;
+ }
+ }
+ break;
+ case GDK_KEY_Home:
+ //Move item(s) to top of containing group/layer
+ _fireAction( empty ? SP_VERB_LAYER_TO_TOP : SP_VERB_SELECTION_TO_FRONT );
+ break;
+ case GDK_KEY_End:
+ //Move item(s) to bottom of containing group/layer
+ _fireAction( empty ? SP_VERB_LAYER_TO_BOTTOM : SP_VERB_SELECTION_TO_BACK );
+ break;
+ case GDK_KEY_Page_Up:
+ {
+ //Move item(s) up in containing group/layer
+ int ch = event->state & GDK_SHIFT_MASK ? SP_VERB_LAYER_MOVE_TO_NEXT : SP_VERB_SELECTION_RAISE;
+ _fireAction( empty ? SP_VERB_LAYER_RAISE : ch );
+ break;
+ }
+ case GDK_KEY_Page_Down:
+ {
+ //Move item(s) down in containing group/layer
+ int ch = event->state & GDK_SHIFT_MASK ? SP_VERB_LAYER_MOVE_TO_PREV : SP_VERB_SELECTION_LOWER;
+ _fireAction( empty ? SP_VERB_LAYER_LOWER : ch );
+ break;
+ }
+
+ //TODO: Handle Ctrl-A, etc.
+ default:
+ return false;
+ }
+ return true;
+}
+
+/**
+ * Handles mouse events
+ * @param event Mouse event from GDK
+ * @return whether to eat the event (om nom nom)
+ */
+bool ObjectsPanel::_handleButtonEvent(GdkEventButton* event)
+{
+ static unsigned doubleclick = 0;
+ static bool overVisible = false;
+
+ //Right mouse button was clicked, launch the pop-up menu
+ if ( (event->type == GDK_BUTTON_PRESS) && (event->button == 3) ) {
+ Gtk::TreeModel::Path path;
+ int x = static_cast<int>(event->x);
+ int y = static_cast<int>(event->y);
+ if ( _tree.get_path_at_pos( x, y, path ) ) {
+ _checkTreeSelection();
+ _popupMenu.popup(event->button, event->time);
+ if (_tree.get_selection()->is_selected(path)) {
+ return true;
+ }
+ }
+ }
+
+ //Left mouse button was pressed! In order to handle multiple item drag & drop,
+ //we need to defer selection by setting the select function so that the tree doesn't
+ //automatically select anything. In order to handle multiple item icon clicking,
+ //we need to eat the event. There might be a better way to do both of these...
+ if ( (event->type == GDK_BUTTON_PRESS) && (event->button == 1)) {
+ overVisible = false;
+ Gtk::TreeModel::Path path;
+ Gtk::TreeViewColumn* col = 0;
+ int x = static_cast<int>(event->x);
+ int y = static_cast<int>(event->y);
+ int x2 = 0;
+ int y2 = 0;
+ if ( _tree.get_path_at_pos( x, y, path, col, x2, y2 ) ) {
+ if (col == _tree.get_column(COL_VISIBLE-1)) {
+ //Click on visible column, eat this event to keep row selection
+ overVisible = true;
+ return true;
+ } else if (col == _tree.get_column(COL_LOCKED-1) ||
+ col == _tree.get_column(COL_TYPE-1) ||
+ //col == _tree.get_column(COL_INSERTORDER - 1) ||
+ col == _tree.get_column(COL_HIGHLIGHT-1)) {
+ //Click on an icon column, eat this event to keep row selection
+ return true;
+ } else if ( !(event->state & (GDK_SHIFT_MASK | GDK_CONTROL_MASK)) & _tree.get_selection()->is_selected(path) ) {
+ //Click on a selected item with no modifiers, defer selection to the mouse-up by
+ //setting the select function to _noSelection
+ _tree.get_selection()->set_select_function(sigc::mem_fun(*this, &ObjectsPanel::_noSelection));
+ _defer_target = path;
+ }
+ }
+ }
+
+ //Restore the selection function to allow tree selection on mouse button release
+ if ( event->type == GDK_BUTTON_RELEASE) {
+ _tree.get_selection()->set_select_function(sigc::mem_fun(*this, &ObjectsPanel::_rowSelectFunction));
+ }
+
+ //CellRenderers do not have good support for dealing with multiple items, so
+ //we handle all events on them here
+ if ( (event->type == GDK_BUTTON_RELEASE) && (event->button == 1)) {
+
+ Gtk::TreeModel::Path path;
+ Gtk::TreeViewColumn* col = 0;
+ int x = static_cast<int>(event->x);
+ int y = static_cast<int>(event->y);
+ int x2 = 0;
+ int y2 = 0;
+ if ( _tree.get_path_at_pos( x, y, path, col, x2, y2 ) ) {
+ if (_defer_target) {
+ //We had deferred a selection target, select it here (assuming no drag & drop)
+ if (_defer_target == path && !(event->x == 0 && event->y == 0))
+ {
+ _tree.set_cursor(path, *col, false);
+ }
+ _defer_target = Gtk::TreeModel::Path();
+ }
+ else {
+ if (event->state & GDK_SHIFT_MASK) {
+ // Shift left click on the visible/lock columns toggles "solo" mode
+ if (col == _tree.get_column(COL_VISIBLE - 1)) {
+ _takeAction(BUTTON_SOLO);
+ } else if (col == _tree.get_column(COL_LOCKED - 1)) {
+ _takeAction(BUTTON_LOCK_OTHERS);
+ }
+ } else if (event->state & GDK_MOD1_MASK) {
+ // Alt+left click on the visible/lock columns toggles "solo" mode and preserves selection
+ Gtk::TreeModel::iterator iter = _store->get_iter(path);
+ if (_store->iter_is_valid(iter)) {
+ Gtk::TreeModel::Row row = *iter;
+ SPItem *item = row[_model->_colObject];
+ if (col == _tree.get_column(COL_VISIBLE - 1)) {
+ _desktop->toggleLayerSolo( item );
+ DocumentUndo::maybeDone(_desktop->doc(), "layer:solo", SP_VERB_LAYER_SOLO, _("Toggle layer solo"));
+ } else if (col == _tree.get_column(COL_LOCKED - 1)) {
+ _desktop->toggleLockOtherLayers( item );
+ DocumentUndo::maybeDone(_desktop->doc(), "layer:lockothers", SP_VERB_LAYER_LOCK_OTHERS, _("Lock other layers"));
+ }
+ }
+ } else {
+ Gtk::TreeModel::Children::iterator iter = _tree.get_model()->get_iter(path);
+ Gtk::TreeModel::Row row = *iter;
+
+ SPItem* item = row[_model->_colObject];
+
+ if (col == _tree.get_column(COL_VISIBLE - 1)) {
+ if (overVisible) {
+ //Toggle visibility
+ bool newValue = !row[_model->_colVisible];
+ if (_tree.get_selection()->is_selected(path))
+ {
+ //If the current row is selected, toggle the visibility
+ //for all selected items
+ _tree.get_selection()->selected_foreach_iter(sigc::bind<bool>(sigc::mem_fun(*this, &ObjectsPanel::_setVisibleIter), newValue));
+ }
+ else
+ {
+ //If the current row is not selected, toggle just its visibility
+ row[_model->_colVisible] = newValue;
+ item->setHidden(!newValue);
+ item->updateRepr(SP_OBJECT_WRITE_NO_CHILDREN | SP_OBJECT_WRITE_EXT);
+ }
+ DocumentUndo::done( _desktop->doc() , SP_VERB_DIALOG_OBJECTS,
+ newValue? _("Unhide objects") : _("Hide objects"));
+ overVisible = false;
+ }
+ } else if (col == _tree.get_column(COL_LOCKED - 1)) {
+ //Toggle locking
+ bool newValue = !row[_model->_colLocked];
+ if (_tree.get_selection()->is_selected(path))
+ {
+ //If the current row is selected, toggle the sensitivity for
+ //all selected items
+ _tree.get_selection()->selected_foreach_iter(sigc::bind<bool>(sigc::mem_fun(*this, &ObjectsPanel::_setLockedIter), newValue));
+ }
+ else
+ {
+ //If the current row is not selected, toggle just its sensitivity
+ row[_model->_colLocked] = newValue;
+ item->setLocked( newValue );
+ item->updateRepr(SP_OBJECT_WRITE_NO_CHILDREN | SP_OBJECT_WRITE_EXT);
+ }
+ DocumentUndo::done( _desktop->doc() , SP_VERB_DIALOG_OBJECTS,
+ newValue? _("Lock objects") : _("Unlock objects"));
+
+ } else if (col == _tree.get_column(COL_TYPE - 1)) {
+ if (SP_IS_GROUP(item))
+ {
+ //Toggle the current item between a group and a layer
+ SPGroup * g = SP_GROUP(item);
+ bool newValue = g->layerMode() == SPGroup::LAYER;
+ row[_model->_colType] = newValue ? 1: 2;
+ g->setLayerMode(newValue ? SPGroup::GROUP : SPGroup::LAYER);
+ g->updateRepr(SP_OBJECT_WRITE_NO_CHILDREN | SP_OBJECT_WRITE_EXT);
+ DocumentUndo::done( _desktop->doc() , SP_VERB_DIALOG_OBJECTS,
+ newValue? _("Layer to group") : _("Group to layer"));
+ }
+ } /*else if (col == _tree.get_column(COL_INSERTORDER - 1)) {
+ if (SP_IS_GROUP(item))
+ {
+ //Toggle the current item's insert order
+ SPGroup * g = SP_GROUP(item);
+ bool newValue = !g->insertBottom();
+ row[_model->_colInsertOrder] = newValue ? 2: 1;
+ g->setInsertBottom(newValue);
+ g->updateRepr(SP_OBJECT_WRITE_NO_CHILDREN | SP_OBJECT_WRITE_EXT);
+ DocumentUndo::done( _desktop->doc() , SP_VERB_DIALOG_OBJECTS,
+ newValue? _("Set insert mode bottom") : _("Set insert mode top"));
+ }
+ }*/ else if (col == _tree.get_column(COL_HIGHLIGHT - 1)) {
+ //Clear the highlight targets
+ _highlight_target.clear();
+ if (_tree.get_selection()->is_selected(path))
+ {
+ //If the current item is selected, store all selected items
+ //in the highlight source
+ _tree.get_selection()->selected_foreach_iter(sigc::mem_fun(*this, &ObjectsPanel::_storeHighlightTarget));
+ } else {
+ //If the current item is not selected, store only it in the highlight source
+ _storeHighlightTarget(iter);
+ }
+ if (_colorSelector)
+ {
+ //Set up the color selector
+ SPColor color;
+ color.set( row[_model->_colHighlight] );
+ _colorSelector->base->setColorAlpha(color, SP_RGBA32_A_F(row[_model->_colHighlight]));
+ }
+ //Show the color selector dialog
+ _colorSelectorDialog.show();
+ }
+ }
+ }
+ }
+ }
+
+ //Second mouse button press, set double click status for when the mouse is released
+ if ( (event->type == GDK_2BUTTON_PRESS) && (event->button == 1) ) {
+ doubleclick = 1;
+ }
+
+ //Double click on mouse button release, if we're over the label column, edit
+ //the item name
+ if ( event->type == GDK_BUTTON_RELEASE && doubleclick) {
+ doubleclick = 0;
+ Gtk::TreeModel::Path path;
+ Gtk::TreeViewColumn* col = 0;
+ int x = static_cast<int>(event->x);
+ int y = static_cast<int>(event->y);
+ int x2 = 0;
+ int y2 = 0;
+ if ( _tree.get_path_at_pos( x, y, path, col, x2, y2 ) && col == _name_column) {
+ // Double click on the Layer name, enable editing
+ _text_renderer->property_editable() = true;
+ _tree.set_cursor (path, *_name_column, true);
+ grab_focus();
+ }
+ }
+
+ return false;
+}
+
+/**
+ * Stores items in the highlight target vector to manipulate with the color selector
+ * @param iter Current tree item to store
+ */
+void ObjectsPanel::_storeHighlightTarget(const Gtk::TreeModel::iterator& iter)
+{
+ Gtk::TreeModel::Row row = *iter;
+ SPItem* item = row[_model->_colObject];
+ if (item)
+ {
+ _highlight_target.push_back(item);
+ }
+}
+
+/*
+ * Drap and drop within the tree
+ */
+bool ObjectsPanel::_handleDragDrop(const Glib::RefPtr<Gdk::DragContext>& context, int x, int y, guint time)
+{
+ int cell_x = 0, cell_y = 0;
+ Gtk::TreeModel::Path target_path;
+ Gtk::TreeView::Column *target_column;
+
+ //Set up our defaults and clear the source vector
+ _dnd_into = false;
+ _dnd_target = NULL;
+ _dnd_source.clear();
+
+ //Add all selected items to the source vector
+ _tree.get_selection()->selected_foreach_iter(sigc::mem_fun(*this, &ObjectsPanel::_storeDragSource));
+
+ if (_tree.get_path_at_pos (x, y, target_path, target_column, cell_x, cell_y)) {
+ // Are we before, inside or after the drop layer
+ Gdk::Rectangle rect;
+ _tree.get_background_area (target_path, *target_column, rect);
+ int cell_height = rect.get_height();
+ _dnd_into = (cell_y > (int)(cell_height * 1/4) && cell_y <= (int)(cell_height * 3/4));
+ if (cell_y > (int)(cell_height * 3/4)) {
+ Gtk::TreeModel::Path next_path = target_path;
+ next_path.next();
+ if (_store->iter_is_valid(_store->get_iter(next_path))) {
+ target_path = next_path;
+ } else {
+ // Dragging to the "end"
+ Gtk::TreeModel::Path up_path = target_path;
+ up_path.up();
+ if (_store->iter_is_valid(_store->get_iter(up_path))) {
+ // Drop into parent
+ target_path = up_path;
+ _dnd_into = true;
+ } else {
+ // Drop into the top level
+ _dnd_target = NULL;
+ }
+ }
+ }
+ Gtk::TreeModel::iterator iter = _store->get_iter(target_path);
+ if (_store->iter_is_valid(iter)) {
+ Gtk::TreeModel::Row row = *iter;
+ //Set the drop target. If we're not dropping into a group, we cannot
+ //drop into it, so set _dnd_into false.
+ _dnd_target = row[_model->_colObject];
+ if (!(SP_IS_GROUP(_dnd_target))) _dnd_into = false;
+ }
+ }
+
+ _takeAction(DRAGNDROP);
+
+ return false;
+}
+
+/**
+ * Stores all selected items as the drag source
+ * @param iter Current tree item
+ */
+void ObjectsPanel::_storeDragSource(const Gtk::TreeModel::iterator& iter)
+{
+ Gtk::TreeModel::Row row = *iter;
+ SPItem* item = row[_model->_colObject];
+ if (item)
+ {
+ _dnd_source.push_back(item);
+ }
+}
+
+/*
+ * Move a layer in response to a drag & drop action
+ */
+void ObjectsPanel::_doTreeMove( )
+{
+ g_assert(_desktop != NULL);
+ g_assert(_document != NULL);
+
+ std::vector<gchar *> idvector;
+
+ //Clear the desktop selection
+ _desktop->selection->clear();
+ while (!_dnd_source.empty())
+ {
+ SPItem *obj = _dnd_source.back();
+ _dnd_source.pop_back();
+
+ if (obj != _dnd_target) {
+ //Store the object id (for selection later) and move the object
+ idvector.push_back(g_strdup(obj->getId()));
+ obj->moveTo(_dnd_target, _dnd_into);
+ }
+ }
+
+ //Select items
+ while (!idvector.empty()) {
+ //Grab the id from the vector, get the item in the document and select it
+ gchar * id = idvector.back();
+ idvector.pop_back();
+ SPObject *obj = _document->getObjectById(id);
+ g_free(id);
+ if (obj && SP_IS_ITEM(obj)) {
+ SPItem *item = SP_ITEM(obj);
+ if (!SP_IS_GROUP(item) || SP_GROUP(item)->layerMode() != SPGroup::LAYER)
+ {
+ if (_desktop->selection->isEmpty()) _desktop->setCurrentLayer(item->parent);
+ _desktop->selection->add(item);
+ }
+ else
+ {
+ if (_desktop->selection->isEmpty()) _desktop->setCurrentLayer(item);
+ }
+ }
+ }
+
+ DocumentUndo::done( _desktop->doc() , SP_VERB_NONE,
+ _("Moved objects"));
+}
+
+/**
+ * Fires the action verb
+ */
+void ObjectsPanel::_fireAction( unsigned int code )
+{
+ if ( _desktop ) {
+ Verb *verb = Verb::get( code );
+ if ( verb ) {
+ SPAction *action = verb->get_action(_desktop);
+ if ( action ) {
+ sp_action_perform( action, NULL );
+ }
+ }
+ }
+}
+
+/**
+ * Executes the given button action during the idle time
+ */
+void ObjectsPanel::_takeAction( int val )
+{
+ if ( !_pending ) {
+ _pending = new InternalUIBounce();
+ _pending->_actionCode = val;
+ Glib::signal_timeout().connect( sigc::mem_fun(*this, &ObjectsPanel::_executeAction), 0 );
+ }
+}
+
+/**
+ * Executes the pending button action
+ */
+bool ObjectsPanel::_executeAction()
+{
+ // Make sure selected layer hasn't changed since the action was triggered
+ if ( _document && _pending)
+ {
+ int val = _pending->_actionCode;
+// SPObject* target = _pending->_target;
+
+ switch ( val ) {
+ case BUTTON_NEW:
+ {
+ _fireAction( SP_VERB_LAYER_NEW );
+ }
+ break;
+ case BUTTON_RENAME:
+ {
+ _fireAction( SP_VERB_LAYER_RENAME );
+ }
+ break;
+ case BUTTON_TOP:
+ {
+ if (_desktop->selection->isEmpty())
+ {
+ _fireAction( SP_VERB_LAYER_TO_TOP );
+ }
+ else
+ {
+ _fireAction( SP_VERB_SELECTION_TO_FRONT);
+ }
+ }
+ break;
+ case BUTTON_BOTTOM:
+ {
+ if (_desktop->selection->isEmpty())
+ {
+ _fireAction( SP_VERB_LAYER_TO_BOTTOM );
+ }
+ else
+ {
+ _fireAction( SP_VERB_SELECTION_TO_BACK);
+ }
+ }
+ break;
+ case BUTTON_UP:
+ {
+ if (_desktop->selection->isEmpty())
+ {
+ _fireAction( SP_VERB_LAYER_RAISE );
+ }
+ else
+ {
+ _fireAction( SP_VERB_SELECTION_RAISE );
+ }
+ }
+ break;
+ case BUTTON_DOWN:
+ {
+ if (_desktop->selection->isEmpty())
+ {
+ _fireAction( SP_VERB_LAYER_LOWER );
+ }
+ else
+ {
+ _fireAction( SP_VERB_SELECTION_LOWER );
+ }
+ }
+ break;
+ case BUTTON_DUPLICATE:
+ {
+ if (_desktop->selection->isEmpty())
+ {
+ _fireAction( SP_VERB_LAYER_DUPLICATE );
+ }
+ else
+ {
+ _fireAction( SP_VERB_EDIT_DUPLICATE );
+ }
+ }
+ break;
+ case BUTTON_DELETE:
+ {
+ if (_desktop->selection->isEmpty())
+ {
+ _fireAction( SP_VERB_LAYER_DELETE );
+ }
+ else
+ {
+ _fireAction( SP_VERB_EDIT_DELETE );
+ }
+ }
+ break;
+ case BUTTON_SOLO:
+ {
+ _fireAction( SP_VERB_LAYER_SOLO );
+ }
+ break;
+ case BUTTON_SHOW_ALL:
+ {
+ _fireAction( SP_VERB_LAYER_SHOW_ALL );
+ }
+ break;
+ case BUTTON_HIDE_ALL:
+ {
+ _fireAction( SP_VERB_LAYER_HIDE_ALL );
+ }
+ break;
+ case BUTTON_LOCK_OTHERS:
+ {
+ _fireAction( SP_VERB_LAYER_LOCK_OTHERS );
+ }
+ break;
+ case BUTTON_LOCK_ALL:
+ {
+ _fireAction( SP_VERB_LAYER_LOCK_ALL );
+ }
+ break;
+ case BUTTON_UNLOCK_ALL:
+ {
+ _fireAction( SP_VERB_LAYER_UNLOCK_ALL );
+ }
+ break;
+ case BUTTON_CLIPGROUP:
+ {
+ _fireAction ( SP_VERB_OBJECT_CREATE_CLIP_GROUP );
+ }
+ case BUTTON_SETCLIP:
+ {
+ _fireAction( SP_VERB_OBJECT_SET_CLIPPATH );
+ }
+ break;
+ case BUTTON_UNSETCLIP:
+ {
+ _fireAction( SP_VERB_OBJECT_UNSET_CLIPPATH );
+ }
+ break;
+ case BUTTON_SETMASK:
+ {
+ _fireAction( SP_VERB_OBJECT_SET_MASK );
+ }
+ break;
+ case BUTTON_UNSETMASK:
+ {
+ _fireAction( SP_VERB_OBJECT_UNSET_MASK );
+ }
+ break;
+ case BUTTON_GROUP:
+ {
+ _fireAction( SP_VERB_SELECTION_GROUP );
+ }
+ break;
+ case BUTTON_UNGROUP:
+ {
+ _fireAction( SP_VERB_SELECTION_UNGROUP );
+ }
+ break;
+ case BUTTON_COLLAPSE_ALL:
+ {
+ for (SPObject* obj = _document->getRoot()->firstChild(); obj != NULL; obj = obj->next) {
+ if (SP_IS_GROUP(obj)) {
+ _setCollapsed(SP_GROUP(obj));
+ }
+ }
+ _objectsChanged(_document->getRoot());
+ }
+ break;
+ case DRAGNDROP:
+ {
+ _doTreeMove( );
+ }
+ break;
+ }
+
+ delete _pending;
+ _pending = 0;
+ }
+
+ return false;
+}
+
+/**
+ * Handles an unsuccessful item label edit (escape pressed, etc.)
+ */
+void ObjectsPanel::_handleEditingCancelled()
+{
+ _text_renderer->property_editable() = false;
+}
+
+/**
+ * Handle a successful item label edit
+ * @param path Tree path of the item currently being edited
+ * @param new_text New label text
+ */
+void ObjectsPanel::_handleEdited(const Glib::ustring& path, const Glib::ustring& new_text)
+{
+ Gtk::TreeModel::iterator iter = _tree.get_model()->get_iter(path);
+ Gtk::TreeModel::Row row = *iter;
+
+ _renameObject(row, new_text);
+ _text_renderer->property_editable() = false;
+}
+
+/**
+ * Renames an item in the tree
+ * @param row Tree row
+ * @param name New label to give to the item
+ */
+void ObjectsPanel::_renameObject(Gtk::TreeModel::Row row, const Glib::ustring& name)
+{
+ if ( row && _desktop) {
+ SPItem* item = row[_model->_colObject];
+ if ( item ) {
+ gchar const* oldLabel = item->label();
+ if ( !name.empty() && (!oldLabel || name != oldLabel) ) {
+ item->setLabel(name.c_str());
+ DocumentUndo::done( _desktop->doc() , SP_VERB_NONE,
+ _("Rename object"));
+ }
+ }
+ }
+}
+
+/**
+ * A row selection function used by the tree that doesn't allow any new items to be selected.
+ * Currently, this is used to allow multi-item drag & drop.
+ */
+bool ObjectsPanel::_noSelection( Glib::RefPtr<Gtk::TreeModel> const & /*model*/, Gtk::TreeModel::Path const & /*path*/, bool /*currentlySelected*/ )
+{
+ return false;
+}
+
+/**
+ * Default row selection function taken from the layers dialog
+ */
+bool ObjectsPanel::_rowSelectFunction( Glib::RefPtr<Gtk::TreeModel> const & /*model*/, Gtk::TreeModel::Path const & /*path*/, bool currentlySelected )
+{
+ bool val = true;
+ if ( !currentlySelected && _toggleEvent )
+ {
+ GdkEvent* event = gtk_get_current_event();
+ if ( event ) {
+ // (keep these checks separate, so we know when to call gdk_event_free()
+ if ( event->type == GDK_BUTTON_PRESS ) {
+ GdkEventButton const* target = reinterpret_cast<GdkEventButton const*>(_toggleEvent);
+ GdkEventButton const* evtb = reinterpret_cast<GdkEventButton const*>(event);
+
+ if ( (evtb->window == target->window)
+ && (evtb->send_event == target->send_event)
+ && (evtb->time == target->time)
+ && (evtb->state == target->state)
+ )
+ {
+ // Ooooh! It's a magic one
+ val = false;
+ }
+ }
+ gdk_event_free(event);
+ }
+ }
+ return val;
+}
+
+/**
+ * Sets a group to be collapsed and recursively collapses its children
+ * @param group The group to collapse
+ */
+void ObjectsPanel::_setCollapsed(SPGroup * group)
+{
+ group->setExpanded(false);
+ group->updateRepr(SP_OBJECT_WRITE_NO_CHILDREN | SP_OBJECT_WRITE_EXT);
+ for (SPObject *iter = group->children; iter != NULL; iter = iter->next)
+ {
+ if (SP_IS_GROUP(iter)) _setCollapsed(SP_GROUP(iter));
+ }
+}
+
+/**
+ * Sets a group to be expanded or collapsed
+ * @param iter Current tree item
+ * @param isexpanded Whether to expand or collapse
+ */
+void ObjectsPanel::_setExpanded(const Gtk::TreeModel::iterator& iter, const Gtk::TreeModel::Path& /*path*/, bool isexpanded)
+{
+ Gtk::TreeModel::Row row = *iter;
+
+ SPItem* item = row[_model->_colObject];
+ if (item && SP_IS_GROUP(item))
+ {
+ if (isexpanded)
+ {
+ //If we're expanding, simply perform the expansion
+ SP_GROUP(item)->setExpanded(isexpanded);
+ item->updateRepr(SP_OBJECT_WRITE_NO_CHILDREN | SP_OBJECT_WRITE_EXT);
+ }
+ else
+ {
+ //If we're collapsing, we need to recursively collapse, so call our helper function
+ _setCollapsed(SP_GROUP(item));
+ }
+ }
+}
+
+/**
+ * Callback for when the highlight color is changed
+ * @param csel Color selector
+ * @param cp Objects panel
+ */
+void sp_highlight_picker_color_mod(SPColorSelector *csel, GObject * cp)
+{
+ SPColor color;
+ float alpha = 0;
+ csel->base->getColorAlpha(color, alpha);
+ guint32 rgba = color.toRGBA32( alpha );
+
+ ObjectsPanel *ptr = reinterpret_cast<ObjectsPanel *>(cp);
+
+ //Set the highlight color for all items in the _highlight_target (all selected items)
+ for (std::vector<SPItem *>::iterator iter = ptr->_highlight_target.begin(); iter != ptr->_highlight_target.end(); ++iter)
+ {
+ SPItem * target = *iter;
+ target->setHighlightColor(rgba);
+ target->updateRepr(SP_OBJECT_WRITE_NO_CHILDREN | SP_OBJECT_WRITE_EXT);
+ }
+ DocumentUndo::maybeDone(SP_ACTIVE_DOCUMENT, "highlight", SP_VERB_DIALOG_OBJECTS, _("Set object highlight color"));
+}
+
+/**
+ * Callback for when the opacity value is changed
+ */
+void ObjectsPanel::_opacityValueChanged()
+{
+ _blockCompositeUpdate = true;
+ _tree.get_selection()->selected_foreach_iter(sigc::mem_fun(*this, &ObjectsPanel::_opacityChangedIter));
+ DocumentUndo::maybeDone(_document, "opacity", SP_VERB_DIALOG_OBJECTS, _("Set object opacity"));
+ _blockCompositeUpdate = false;
+}
+
+/**
+ * Change the opacity of the selected items in the tree
+ * @param iter Current tree item
+ */
+void ObjectsPanel::_opacityChangedIter(const Gtk::TreeIter& iter)
+{
+ Gtk::TreeModel::Row row = *iter;
+ SPItem* item = row[_model->_colObject];
+ if (item)
+ {
+ item->style->opacity.set = TRUE;
+#if WITH_GTKMM_3_0
+ item->style->opacity.value = SP_SCALE24_FROM_FLOAT(_opacity_adjustment->get_value() / _opacity_adjustment->get_upper());
+#else
+ item->style->opacity.value = SP_SCALE24_FROM_FLOAT(_opacity_adjustment.get_value() / _opacity_adjustment.get_upper());
+#endif
+ item->updateRepr(SP_OBJECT_WRITE_NO_CHILDREN | SP_OBJECT_WRITE_EXT);
+ }
+}
+
+/**
+ * Callback for when the blend mode is changed
+ */
+void ObjectsPanel::_blendValueChanged()
+{
+ _blockCompositeUpdate = true;
+ const Glib::ustring blendmode = _fe_cb.get_blend_mode();
+
+ _tree.get_selection()->selected_foreach_iter(sigc::bind<Glib::ustring>(sigc::mem_fun(*this, &ObjectsPanel::_blendChangedIter), blendmode));
+ DocumentUndo::done(_document, SP_VERB_DIALOG_OBJECTS, _("Set object blend mode"));
+ _blockCompositeUpdate = false;
+}
+
+/**
+ * Sets the blend mode of the selected tree items
+ * @param iter Current tree item
+ * @param blendmode Blend mode to set
+ */
+void ObjectsPanel::_blendChangedIter(const Gtk::TreeIter& iter, Glib::ustring blendmode)
+{
+ Gtk::TreeModel::Row row = *iter;
+ SPItem* item = row[_model->_colObject];
+ if (item)
+ {
+ //Since blur and blend are both filters, we need to set both at the same time
+ SPStyle *style = item->style;
+ g_assert(style != NULL);
+
+ if (blendmode != "normal") {
+ gdouble radius = 0;
+ if (item->style->getFilter()) {
+ for (SPObject *primitive = item->style->getFilter()->children; primitive && SP_IS_FILTER_PRIMITIVE(primitive); primitive = primitive->next) {
+ if (SP_IS_GAUSSIANBLUR(primitive)) {
+ Geom::OptRect bbox = item->bounds(SPItem::GEOMETRIC_BBOX);
+ if (bbox) {
+ radius = SP_GAUSSIANBLUR(primitive)->stdDeviation.getNumber();
+ }
+ }
+ }
+ }
+ SPFilter *filter = new_filter_simple_from_item(_document, item, blendmode.c_str(), radius);
+ sp_style_set_property_url(item, "filter", filter, false);
+ } else {
+ for (SPObject *primitive = item->style->getFilter()->children; primitive && SP_IS_FILTER_PRIMITIVE(primitive); primitive = primitive->next) {
+ if (SP_IS_FEBLEND(primitive)) {
+ primitive->deleteObject();
+ break;
+ }
+ }
+ if (!item->style->getFilter()->children) {
+ remove_filter(item, false);
+ }
+ }
+
+ item->updateRepr(SP_OBJECT_WRITE_NO_CHILDREN | SP_OBJECT_WRITE_EXT);
+ }
+}
+
+/**
+ * Callback for when the blur value has changed
+ */
+void ObjectsPanel::_blurValueChanged()
+{
+ _blockCompositeUpdate = true;
+ _tree.get_selection()->selected_foreach_iter(sigc::bind<double>(sigc::mem_fun(*this, &ObjectsPanel::_blurChangedIter), _fe_blur.get_blur_value()));
+ DocumentUndo::maybeDone(_document, "blur", SP_VERB_DIALOG_OBJECTS, _("Set object blur"));
+ _blockCompositeUpdate = false;
+}
+
+/**
+ * Sets the blur value for the selected items in the tree
+ * @param iter Current tree item
+ * @param blur Blur value to set
+ */
+void ObjectsPanel::_blurChangedIter(const Gtk::TreeIter& iter, double blur)
+{
+ Gtk::TreeModel::Row row = *iter;
+ SPItem* item = row[_model->_colObject];
+ if (item)
+ {
+ //Since blur and blend are both filters, we need to set both at the same time
+ SPStyle *style = item->style;
+ if (style) {
+ Geom::OptRect bbox = item->bounds(SPItem::GEOMETRIC_BBOX);
+ double radius;
+ if (bbox) {
+ double perimeter = bbox->dimensions()[Geom::X] + bbox->dimensions()[Geom::Y]; // fixme: this is only half the perimeter, is that correct?
+ radius = blur * perimeter / 400;
+ } else {
+ radius = 0;
+ }
+
+ if (radius != 0) {
+ SPFilter *filter = modify_filter_gaussian_blur_from_item(_document, item, radius);
+ sp_style_set_property_url(item, "filter", filter, false);
+ } else if (item->style->filter.set && item->style->getFilter()) {
+ for (SPObject *primitive = item->style->getFilter()->children; primitive && SP_IS_FILTER_PRIMITIVE(primitive); primitive = primitive->next) {
+ if (SP_IS_GAUSSIANBLUR(primitive)) {
+ primitive->deleteObject();
+ break;
+ }
+ }
+ if (!item->style->getFilter()->children) {
+ remove_filter(item, false);
+ }
+ }
+ item->updateRepr(SP_OBJECT_WRITE_NO_CHILDREN | SP_OBJECT_WRITE_EXT);
+ }
+ }
+}
+
+/**
+ * Constructor
+ */
+ObjectsPanel::ObjectsPanel() :
+ UI::Widget::Panel("", "/dialogs/objects", SP_VERB_DIALOG_OBJECTS),
+ _rootWatcher(0),
+ _deskTrack(),
+ _desktop(0),
+ _document(0),
+ _model(0),
+ _pending(0),
+ _toggleEvent(0),
+ _defer_target(),
+ _composite_vbox(false, 0),
+ _opacity_vbox(false, 0),
+ _opacity_label(_("Opacity:")),
+ _opacity_label_unit(_("%")),
+#if WITH_GTKMM_3_0
+ _opacity_adjustment(Gtk::Adjustment::create(100.0, 0.0, 100.0, 1.0, 1.0, 0.0)),
+#else
+ _opacity_adjustment(100.0, 0.0, 100.0, 1.0, 1.0, 0.0),
+#endif
+ _opacity_hscale(_opacity_adjustment),
+ _opacity_spin_button(_opacity_adjustment, 0.01, 1),
+ _fe_cb(UI::Widget::SimpleFilterModifier::BLEND),
+ _fe_vbox(false, 0),
+ _fe_alignment(1, 1, 1, 1),
+ _fe_blur(UI::Widget::SimpleFilterModifier::BLUR),
+ _blur_vbox(false, 0),
+ _blur_alignment(1, 1, 1, 1),
+ _colorSelectorDialog("dialogs.colorpickerwindow")
+{
+ //Create the tree model and store
+ ModelColumns *zoop = new ModelColumns();
+ _model = zoop;
+
+ _store = Gtk::TreeStore::create( *zoop );
+
+ //Set up the tree
+ _tree.set_model( _store );
+ _tree.set_headers_visible(false);
+ _tree.set_reorderable(true);
+ _tree.enable_model_drag_dest (Gdk::ACTION_MOVE);
+
+ //Create the column CellRenderers
+ //Visible
+ Inkscape::UI::Widget::ImageToggler *eyeRenderer = Gtk::manage( new Inkscape::UI::Widget::ImageToggler(
+ INKSCAPE_ICON("object-visible"), INKSCAPE_ICON("object-hidden")) );
+ int visibleColNum = _tree.append_column("vis", *eyeRenderer) - 1;
+ eyeRenderer->property_activatable() = true;
+ Gtk::TreeViewColumn* col = _tree.get_column(visibleColNum);
+ if ( col ) {
+ col->add_attribute( eyeRenderer->property_active(), _model->_colVisible );
+ }
+
+ //Locked
+ Inkscape::UI::Widget::ImageToggler * renderer = Gtk::manage( new Inkscape::UI::Widget::ImageToggler(
+ INKSCAPE_ICON("object-locked"), INKSCAPE_ICON("object-unlocked")) );
+ int lockedColNum = _tree.append_column("lock", *renderer) - 1;
+ renderer->property_activatable() = true;
+ col = _tree.get_column(lockedColNum);
+ if ( col ) {
+ col->add_attribute( renderer->property_active(), _model->_colLocked );
+ }
+
+ //Type
+ Inkscape::UI::Widget::LayerTypeIcon * typeRenderer = Gtk::manage( new Inkscape::UI::Widget::LayerTypeIcon());
+ int typeColNum = _tree.append_column("type", *typeRenderer) - 1;
+ typeRenderer->property_activatable() = true;
+ col = _tree.get_column(typeColNum);
+ if ( col ) {
+ col->add_attribute( typeRenderer->property_active(), _model->_colType );
+ }
+
+ //Insert order (LiamW: unused)
+ /*Inkscape::UI::Widget::InsertOrderIcon * insertRenderer = Gtk::manage( new Inkscape::UI::Widget::InsertOrderIcon());
+ int insertColNum = _tree.append_column("type", *insertRenderer) - 1;
+ col = _tree.get_column(insertColNum);
+ if ( col ) {
+ col->add_attribute( insertRenderer->property_active(), _model->_colInsertOrder );
+ }*/
+
+ //Clip/mask
+ Inkscape::UI::Widget::ClipMaskIcon * clipRenderer = Gtk::manage( new Inkscape::UI::Widget::ClipMaskIcon());
+ int clipColNum = _tree.append_column("clipmask", *clipRenderer) - 1;
+ col = _tree.get_column(clipColNum);
+ if ( col ) {
+ col->add_attribute( clipRenderer->property_active(), _model->_colClipMask );
+ }
+
+ //Highlight
+ Inkscape::UI::Widget::HighlightPicker * highlightRenderer = Gtk::manage( new Inkscape::UI::Widget::HighlightPicker());
+ int highlightColNum = _tree.append_column("highlight", *highlightRenderer) - 1;
+ col = _tree.get_column(highlightColNum);
+ if ( col ) {
+ col->add_attribute( highlightRenderer->property_active(), _model->_colHighlight );
+ }
+
+ //Label
+ _text_renderer = Gtk::manage(new Gtk::CellRendererText());
+ int nameColNum = _tree.append_column("Name", *_text_renderer) - 1;
+ _name_column = _tree.get_column(nameColNum);
+ _name_column->add_attribute(_text_renderer->property_text(), _model->_colLabel);
+
+ //Set the expander and search columns
+ _tree.set_expander_column( *_tree.get_column(nameColNum) );
+ _tree.set_search_column(_model->_colLabel);
+
+ //Set up the tree selection
+ _tree.get_selection()->set_mode(Gtk::SELECTION_MULTIPLE);
+ _selectedConnection = _tree.get_selection()->signal_changed().connect( sigc::mem_fun(*this, &ObjectsPanel::_pushTreeSelectionToCurrent) );
+ _tree.get_selection()->set_select_function( sigc::mem_fun(*this, &ObjectsPanel::_rowSelectFunction) );
+
+ //Set up tree signals
+ _tree.signal_button_press_event().connect( sigc::mem_fun(*this, &ObjectsPanel::_handleButtonEvent), false );
+ _tree.signal_button_release_event().connect( sigc::mem_fun(*this, &ObjectsPanel::_handleButtonEvent), false );
+ _tree.signal_key_press_event().connect( sigc::mem_fun(*this, &ObjectsPanel::_handleKeyEvent), false );
+ _tree.signal_drag_drop().connect( sigc::mem_fun(*this, &ObjectsPanel::_handleDragDrop), false);
+ _tree.signal_row_collapsed().connect( sigc::bind<bool>(sigc::mem_fun(*this, &ObjectsPanel::_setExpanded), false));
+ _tree.signal_row_expanded().connect( sigc::bind<bool>(sigc::mem_fun(*this, &ObjectsPanel::_setExpanded), true));
+
+ //Set up the label editing signals
+ _text_renderer->signal_edited().connect( sigc::mem_fun(*this, &ObjectsPanel::_handleEdited) );
+ _text_renderer->signal_editing_canceled().connect( sigc::mem_fun(*this, &ObjectsPanel::_handleEditingCancelled) );
+
+ //Set up the scroller window and pack the page
+ _scroller.add( _tree );
+ _scroller.set_policy( Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC );
+ _scroller.set_shadow_type(Gtk::SHADOW_IN);
+ Gtk::Requisition sreq;
+#if WITH_GTKMM_3_0
+ Gtk::Requisition sreq_natural;
+ _scroller.get_preferred_size(sreq_natural, sreq);
+#else
+ sreq = _scroller.size_request();
+#endif
+ int minHeight = 70;
+ if (sreq.height < minHeight) {
+ // Set a min height to see the layers when used with Ubuntu liboverlay-scrollbar
+ _scroller.set_size_request(sreq.width, minHeight);
+ }
+
+ _page.pack_start( _scroller, Gtk::PACK_EXPAND_WIDGET );
+
+ //Set up the compositing items
+ //Blend mode filter effect
+ _composite_vbox.pack_start(_fe_vbox, false, false, 2);
+ _fe_alignment.set_padding(0, 0, 4, 0);
+ _fe_alignment.add(_fe_cb);
+ _fe_vbox.pack_start(_fe_alignment, false, false, 0);
+ _blendConnection = _fe_cb.signal_blend_blur_changed().connect(sigc::mem_fun(*this, &ObjectsPanel::_blendValueChanged));
+
+ //Blur filter effect
+ _composite_vbox.pack_start(_blur_vbox, false, false, 2);
+ _blur_alignment.set_padding(0, 0, 4, 0);
+ _blur_alignment.add(_fe_blur);
+ _blur_vbox.pack_start(_blur_alignment, false, false, 0);
+ _blurConnection = _fe_blur.signal_blend_blur_changed().connect(sigc::mem_fun(*this, &ObjectsPanel::_blurValueChanged));
+
+ //Opacity
+ _composite_vbox.pack_start(_opacity_vbox, false, false, 2);
+ _opacity_label.set_alignment(Gtk::ALIGN_END, Gtk::ALIGN_CENTER);
+ _opacity_hbox.pack_start(_opacity_label, false, false, 3);
+ _opacity_vbox.pack_start(_opacity_hbox, false, false, 0);
+ _opacity_hbox.pack_start(_opacity_hscale, true, true, 0);
+ _opacity_hbox.pack_start(_opacity_spin_button, false, false, 0);
+ _opacity_hbox.pack_start(_opacity_label_unit, false, false, 3);
+ _opacity_hscale.set_draw_value(false);
+#if WITH_GTKMM_3_0
+ _opacityConnection = _opacity_adjustment->signal_value_changed().connect(sigc::mem_fun(*this, &ObjectsPanel::_opacityValueChanged));
+ _opacity_label.set_mnemonic_widget(_opacity_hscale);
+#else
+ _opacityConnection = _opacity_adjustment.signal_value_changed().connect(sigc::mem_fun(*this, &ObjectsPanel::_opacityValueChanged));
+ _opacity_label.set_mnemonic_widget(_opacity_hscale);
+#endif
+
+ //Keep the labels aligned
+ GtkSizeGroup *labels = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL);
+ gtk_size_group_add_widget(labels, GTK_WIDGET(_opacity_label.gobj()));
+ gtk_size_group_add_widget(labels, GTK_WIDGET(_fe_cb.get_blur_label()->gobj()));
+ gtk_size_group_add_widget(labels, GTK_WIDGET(_fe_blur.get_blur_label()->gobj()));
+
+ //Pack the compositing functions and the button row
+ _page.pack_end(_composite_vbox, Gtk::PACK_SHRINK);
+ _page.pack_end(_buttonsRow, Gtk::PACK_SHRINK);
+
+ //Pack into the panel contents
+ _getContents()->pack_start(_page, Gtk::PACK_EXPAND_WIDGET);
+
+ SPDesktop* targetDesktop = getDesktop();
+
+ //Set up the button row
+
+
+ //Add object/layer
+ Gtk::Button* btn = Gtk::manage( new Gtk::Button() );
+ btn->set_tooltip_text(_("Add layer..."));
+#if GTK_CHECK_VERSION(3,10,0)
+ btn->set_image_from_icon_name(INKSCAPE_ICON("list-add"), Gtk::ICON_SIZE_SMALL_TOOLBAR);
+#else
+ Gtk::Image *image_add = Gtk::manage(new Gtk::Image());
+ image_add->set_from_icon_name(INKSCAPE_ICON("list-add"), Gtk::ICON_SIZE_SMALL_TOOLBAR);
+ btn->set_image(*image_add);
+#endif
+ btn->set_relief(Gtk::RELIEF_NONE);
+ btn->signal_clicked().connect( sigc::bind( sigc::mem_fun(*this, &ObjectsPanel::_takeAction), (int)BUTTON_NEW) );
+ _buttonsSecondary.pack_start(*btn, Gtk::PACK_SHRINK);
+
+
+ //Remove object
+ btn = Gtk::manage( new Gtk::Button() );
+ btn->set_tooltip_text(_("Remove object"));
+#if GTK_CHECK_VERSION(3,10,0)
+ btn->set_image_from_icon_name(INKSCAPE_ICON("list-remove"), Gtk::ICON_SIZE_SMALL_TOOLBAR);
+#else
+ Gtk::Image *image_remove = Gtk::manage(new Gtk::Image());
+ image_remove->set_from_icon_name(INKSCAPE_ICON("list-remove"), Gtk::ICON_SIZE_SMALL_TOOLBAR);
+ btn->set_image(*image_remove);
+#endif
+ btn->set_relief(Gtk::RELIEF_NONE);
+ btn->signal_clicked().connect( sigc::bind( sigc::mem_fun(*this, &ObjectsPanel::_takeAction), (int)BUTTON_DELETE) );
+ _watching.push_back( btn );
+ _buttonsSecondary.pack_start(*btn, Gtk::PACK_SHRINK);
+
+ //Move to bottom
+ btn = Gtk::manage( new Gtk::Button() );
+ btn->set_tooltip_text(_("Move To Bottom"));
+#if GTK_CHECK_VERSION(3,10,0)
+ btn->set_image_from_icon_name(INKSCAPE_ICON("go-bottom"), Gtk::ICON_SIZE_SMALL_TOOLBAR);
+#else
+ image_remove = Gtk::manage(new Gtk::Image());
+ image_remove->set_from_icon_name(INKSCAPE_ICON("go-bottom"), Gtk::ICON_SIZE_SMALL_TOOLBAR);
+ btn->set_image(*image_remove);
+#endif
+ btn->set_relief(Gtk::RELIEF_NONE);
+ btn->signal_clicked().connect( sigc::bind( sigc::mem_fun(*this, &ObjectsPanel::_takeAction), (int)BUTTON_BOTTOM) );
+ _watchingNonBottom.push_back( btn );
+ _buttonsPrimary.pack_end(*btn, Gtk::PACK_SHRINK);
+
+ //Move down
+ btn = Gtk::manage( new Gtk::Button() );
+ btn->set_tooltip_text(_("Move Down"));
+#if GTK_CHECK_VERSION(3,10,0)
+ btn->set_image_from_icon_name(INKSCAPE_ICON("go-down"), Gtk::ICON_SIZE_SMALL_TOOLBAR);
+#else
+ image_remove = Gtk::manage(new Gtk::Image());
+ image_remove->set_from_icon_name(INKSCAPE_ICON("go-down"), Gtk::ICON_SIZE_SMALL_TOOLBAR);
+ btn->set_image(*image_remove);
+#endif
+ btn->set_relief(Gtk::RELIEF_NONE);
+ btn->signal_clicked().connect( sigc::bind( sigc::mem_fun(*this, &ObjectsPanel::_takeAction), (int)BUTTON_DOWN) );
+ _watchingNonBottom.push_back( btn );
+ _buttonsPrimary.pack_end(*btn, Gtk::PACK_SHRINK);
+
+ //Move up
+ btn = Gtk::manage( new Gtk::Button() );
+ btn->set_tooltip_text(_("Move Up"));
+#if GTK_CHECK_VERSION(3,10,0)
+ btn->set_image_from_icon_name(INKSCAPE_ICON("go-up"), Gtk::ICON_SIZE_SMALL_TOOLBAR);
+#else
+ image_remove = Gtk::manage(new Gtk::Image());
+ image_remove->set_from_icon_name(INKSCAPE_ICON("go-up"), Gtk::ICON_SIZE_SMALL_TOOLBAR);
+ btn->set_image(*image_remove);
+#endif
+ btn->set_relief(Gtk::RELIEF_NONE);
+ btn->signal_clicked().connect( sigc::bind( sigc::mem_fun(*this, &ObjectsPanel::_takeAction), (int)BUTTON_UP) );
+ _watchingNonTop.push_back( btn );
+ _buttonsPrimary.pack_end(*btn, Gtk::PACK_SHRINK);
+
+ //Move to top
+ btn = Gtk::manage( new Gtk::Button() );
+ btn->set_tooltip_text(_("Move To Top"));
+#if GTK_CHECK_VERSION(3,10,0)
+ btn->set_image_from_icon_name(INKSCAPE_ICON("go-top"), Gtk::ICON_SIZE_SMALL_TOOLBAR);
+#else
+ image_remove = Gtk::manage(new Gtk::Image());
+ image_remove->set_from_icon_name(INKSCAPE_ICON("go-top"), Gtk::ICON_SIZE_SMALL_TOOLBAR);
+ btn->set_image(*image_remove);
+#endif
+ btn->set_relief(Gtk::RELIEF_NONE);
+ btn->signal_clicked().connect( sigc::bind( sigc::mem_fun(*this, &ObjectsPanel::_takeAction), (int)BUTTON_TOP) );
+ _watchingNonTop.push_back( btn );
+ _buttonsPrimary.pack_end(*btn, Gtk::PACK_SHRINK);
+
+ //Collapse all
+ btn = Gtk::manage( new Gtk::Button() );
+ btn->set_tooltip_text(_("Collapse All"));
+#if GTK_CHECK_VERSION(3,10,0)
+ btn->set_image_from_icon_name(INKSCAPE_ICON("gtk-unindent-ltr"), Gtk::ICON_SIZE_SMALL_TOOLBAR);
+#else
+ image_remove = Gtk::manage(new Gtk::Image());
+ image_remove->set_from_icon_name(INKSCAPE_ICON("gtk-unindent-ltr"), Gtk::ICON_SIZE_SMALL_TOOLBAR);
+ btn->set_image(*image_remove);
+#endif
+ btn->set_relief(Gtk::RELIEF_NONE);
+ btn->signal_clicked().connect( sigc::bind( sigc::mem_fun(*this, &ObjectsPanel::_takeAction), (int)BUTTON_COLLAPSE_ALL) );
+ _watchingNonBottom.push_back( btn );
+ _buttonsPrimary.pack_end(*btn, Gtk::PACK_SHRINK);
+
+ _buttonsRow.pack_start(_buttonsSecondary, Gtk::PACK_EXPAND_WIDGET);
+ _buttonsRow.pack_end(_buttonsPrimary, Gtk::PACK_EXPAND_WIDGET);
+
+ _watching.push_back(&_composite_vbox);
+
+ //Set up the pop-up menu
+ // -------------------------------------------------------
+ {
+ _watching.push_back( &_addPopupItem( targetDesktop, SP_VERB_LAYER_RENAME, 0, "Rename", (int)BUTTON_RENAME ) );
+ _watching.push_back( &_addPopupItem( targetDesktop, SP_VERB_EDIT_DUPLICATE, 0, "Duplicate", (int)BUTTON_DUPLICATE ) );
+ _watching.push_back( &_addPopupItem( targetDesktop, SP_VERB_LAYER_NEW, 0, "New", (int)BUTTON_NEW ) );
+
+ _popupMenu.append(*Gtk::manage(new Gtk::SeparatorMenuItem()));
+
+ _watching.push_back( &_addPopupItem( targetDesktop, SP_VERB_LAYER_SOLO, 0, "Solo", (int)BUTTON_SOLO ) );
+ _watching.push_back( &_addPopupItem( targetDesktop, SP_VERB_LAYER_SHOW_ALL, 0, "Show All", (int)BUTTON_SHOW_ALL ) );
+ _watching.push_back( &_addPopupItem( targetDesktop, SP_VERB_LAYER_HIDE_ALL, 0, "Hide All", (int)BUTTON_HIDE_ALL ) );
+
+ _popupMenu.append(*Gtk::manage(new Gtk::SeparatorMenuItem()));
+
+ _watching.push_back( &_addPopupItem( targetDesktop, SP_VERB_LAYER_LOCK_OTHERS, 0, "Lock Others", (int)BUTTON_LOCK_OTHERS ) );
+ _watching.push_back( &_addPopupItem( targetDesktop, SP_VERB_LAYER_LOCK_ALL, 0, "Lock All", (int)BUTTON_LOCK_ALL ) );
+ _watching.push_back( &_addPopupItem( targetDesktop, SP_VERB_LAYER_UNLOCK_ALL, 0, "Unlock All", (int)BUTTON_UNLOCK_ALL ) );
+
+ _popupMenu.append(*Gtk::manage(new Gtk::SeparatorMenuItem()));
+
+ _watchingNonTop.push_back( &_addPopupItem( targetDesktop, SP_VERB_SELECTION_RAISE, GTK_STOCK_GO_UP, "Up", (int)BUTTON_UP ) );
+ _watchingNonBottom.push_back( &_addPopupItem( targetDesktop, SP_VERB_SELECTION_LOWER, GTK_STOCK_GO_DOWN, "Down", (int)BUTTON_DOWN ) );
+
+ _popupMenu.append(*Gtk::manage(new Gtk::SeparatorMenuItem()));
+
+ _watching.push_back( &_addPopupItem( targetDesktop, SP_VERB_SELECTION_GROUP, 0, "Group", (int)BUTTON_GROUP ) );
+ _watching.push_back( &_addPopupItem( targetDesktop, SP_VERB_SELECTION_UNGROUP, 0, "Ungroup", (int)BUTTON_UNGROUP ) );
+
+ _popupMenu.append(*Gtk::manage(new Gtk::SeparatorMenuItem()));
+
+ _watching.push_back( &_addPopupItem( targetDesktop, SP_VERB_OBJECT_SET_CLIPPATH, 0, "Set Clip", (int)BUTTON_SETCLIP ) );
+
+ _watching.push_back( &_addPopupItem( targetDesktop, SP_VERB_OBJECT_CREATE_CLIP_GROUP, 0, "Create Clip Group", (int)BUTTON_CLIPGROUP ) );
+
+ //will never be implemented
+ //_watching.push_back( &_addPopupItem( targetDesktop, SP_VERB_OBJECT_SET_INVERSE_CLIPPATH, 0, "Set Inverse Clip", (int)BUTTON_SETINVCLIP ) );
+ _watching.push_back( &_addPopupItem( targetDesktop, SP_VERB_OBJECT_UNSET_CLIPPATH, 0, "Unset Clip", (int)BUTTON_UNSETCLIP ) );
+
+ _popupMenu.append(*Gtk::manage(new Gtk::SeparatorMenuItem()));
+
+ _watching.push_back( &_addPopupItem( targetDesktop, SP_VERB_OBJECT_SET_MASK, 0, "Set Mask", (int)BUTTON_SETMASK ) );
+ _watching.push_back( &_addPopupItem( targetDesktop, SP_VERB_OBJECT_UNSET_MASK, 0, "Unset Mask", (int)BUTTON_UNSETMASK ) );
+
+ _popupMenu.show_all_children();
+ }
+ // -------------------------------------------------------
+
+ //Set initial sensitivity of buttons
+ for ( std::vector<Gtk::Widget*>::iterator it = _watching.begin(); it != _watching.end(); ++it ) {
+ (*it)->set_sensitive( false );
+ }
+ for ( std::vector<Gtk::Widget*>::iterator it = _watchingNonTop.begin(); it != _watchingNonTop.end(); ++it ) {
+ (*it)->set_sensitive( false );
+ }
+ for ( std::vector<Gtk::Widget*>::iterator it = _watchingNonBottom.begin(); it != _watchingNonBottom.end(); ++it ) {
+ (*it)->set_sensitive( false );
+ }
+
+ //Set up the color selection dialog
+ GtkWidget *dlg = GTK_WIDGET(_colorSelectorDialog.gobj());
+ sp_transientize(dlg);
+
+ _colorSelectorDialog.hide();
+ _colorSelectorDialog.set_title (_("Select Highlight Color"));
+ _colorSelectorDialog.set_border_width (4);
+ _colorSelectorDialog.property_modal() = true;
+ _colorSelector = SP_COLOR_SELECTOR(sp_color_selector_new(SP_TYPE_COLOR_NOTEBOOK));
+ _colorSelectorDialog.get_vbox()->pack_start (
+ *Glib::wrap(&_colorSelector->vbox), true, true, 0);
+
+ g_signal_connect(G_OBJECT(_colorSelector), "dragged",
+ G_CALLBACK(sp_highlight_picker_color_mod), (void *)this);
+ g_signal_connect(G_OBJECT(_colorSelector), "released",
+ G_CALLBACK(sp_highlight_picker_color_mod), (void *)this);
+ g_signal_connect(G_OBJECT(_colorSelector), "changed",
+ G_CALLBACK(sp_highlight_picker_color_mod), (void *)this);
+
+ gtk_widget_show(GTK_WIDGET(_colorSelector));
+
+ setDesktop( targetDesktop );
+
+ show_all_children();
+
+ //Connect the desktop changed connection
+ desktopChangeConn = _deskTrack.connectDesktopChanged( sigc::mem_fun(*this, &ObjectsPanel::setDesktop) );
+ _deskTrack.connect(GTK_WIDGET(gobj()));
+}
+
+/**
+ * Destructor
+ */
+ObjectsPanel::~ObjectsPanel()
+{
+ //Close the highlight selection dialog
+ _colorSelectorDialog.hide();
+ _colorSelector = NULL;
+
+ //Set the desktop to null, which will disconnect all object watchers
+ setDesktop(NULL);
+
+ if ( _model )
+ {
+ delete _model;
+ _model = 0;
+ }
+
+ if (_pending) {
+ delete _pending;
+ _pending = 0;
+ }
+
+ if ( _toggleEvent )
+ {
+ gdk_event_free( _toggleEvent );
+ _toggleEvent = 0;
+ }
+
+ desktopChangeConn.disconnect();
+ _deskTrack.disconnect();
+}
+
+/**
+ * Sets the current document
+ */
+void ObjectsPanel::setDocument(SPDesktop* /*desktop*/, SPDocument* document)
+{
+ //Clear all object watchers
+ while (!_objectWatchers.empty())
+ {
+ ObjectsPanel::ObjectWatcher *w = _objectWatchers.back();
+ w->_repr->removeObserver(*w);
+ _objectWatchers.pop_back();
+ delete w;
+ }
+
+ //Delete the root watcher
+ if (_rootWatcher)
+ {
+ _rootWatcher->_repr->removeObserver(*_rootWatcher);
+ delete _rootWatcher;
+ _rootWatcher = NULL;
+ }
+
+ _document = document;
+
+ if (document && document->getRoot() && document->getRoot()->getRepr())
+ {
+ //Create a new root watcher for the document and then call _objectsChanged to fill the tree
+ _rootWatcher = new ObjectsPanel::ObjectWatcher(this, document->getRoot());
+ document->getRoot()->getRepr()->addObserver(*_rootWatcher);
+ _objectsChanged(document->getRoot());
+ }
+}
+
+/**
+ * Set the current panel desktop
+ */
+void ObjectsPanel::setDesktop( SPDesktop* desktop )
+{
+ Panel::setDesktop(desktop);
+
+ if ( desktop != _desktop ) {
+ _documentChangedConnection.disconnect();
+ _selectionChangedConnection.disconnect();
+ if ( _desktop ) {
+ _desktop = 0;
+ }
+
+ _desktop = Panel::getDesktop();
+ if ( _desktop ) {
+ //Connect desktop signals
+ _documentChangedConnection = _desktop->connectDocumentReplaced( sigc::mem_fun(*this, &ObjectsPanel::setDocument));
+ _selectionChangedConnection = _desktop->selection->connectChanged( sigc::mem_fun(*this, &ObjectsPanel::_objectsSelected));
+
+ setDocument(_desktop, _desktop->doc());
+ } else {
+ setDocument(NULL, NULL);
+ }
+ }
+ _deskTrack.setBase(desktop);
+}
+} //namespace Dialogs
+} //namespace UI
+} //namespace Inkscape
+
+//should be okay to put these here because they are never referenced anywhere else
+using namespace Inkscape::UI::Tools;
+
+void SPItem::setHighlightColor(guint32 const color)
+{
+ g_free(_highlightColor);
+ if (color & 0x000000ff)
+ {
+ _highlightColor = g_strdup_printf("%u", color);
+ }
+ else
+ {
+ _highlightColor = NULL;
+ }
+
+ NodeTool *tool = 0;
+ if (SP_ACTIVE_DESKTOP ) {
+ Inkscape::UI::Tools::ToolBase *ec = SP_ACTIVE_DESKTOP->event_context;
+ if (INK_IS_NODE_TOOL(ec)) {
+ tool = static_cast<NodeTool*>(ec);
+ tools_switch(tool->desktop, TOOLS_NODES);
+ }
+ }
+}
+
+void SPItem::unsetHighlightColor()
+{
+ g_free(_highlightColor);
+ _highlightColor = NULL;
+ NodeTool *tool = 0;
+ if (SP_ACTIVE_DESKTOP ) {
+ Inkscape::UI::Tools::ToolBase *ec = SP_ACTIVE_DESKTOP->event_context;
+ if (INK_IS_NODE_TOOL(ec)) {
+ tool = static_cast<NodeTool*>(ec);
+ tools_switch(tool->desktop, TOOLS_NODES);
+ }
+ }
+}
+
+/*
+ Local Variables:
+ mode:c++
+ c-file-style:"stroustrup"
+ c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
+ indent-tabs-mode:nil
+ fill-column:99
+ End:
+*/
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :
diff --git a/src/ui/dialog/objects.h b/src/ui/dialog/objects.h
new file mode 100644
index 000000000..74c2382ac
--- /dev/null
+++ b/src/ui/dialog/objects.h
@@ -0,0 +1,263 @@
+/*
+ * A simple dialog for objects UI.
+ *
+ * Authors:
+ * Theodore Janeczko
+ *
+ * Copyright (C) Theodore Janeczko 2012 <flutterguy317@gmail.com>
+ *
+ * Released under GNU GPL, read the file 'COPYING' for more information
+ */
+
+#ifndef SEEN_OBJECTS_PANEL_H
+#define SEEN_OBJECTS_PANEL_H
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#if GLIBMM_DISABLE_DEPRECATED && HAVE_GLIBMM_THREADS_H
+# include <glibmm/threads.h>
+#endif
+
+#include <gtkmm/box.h>
+#include <gtkmm/treeview.h>
+#include <gtkmm/treestore.h>
+#include <gtkmm/scrolledwindow.h>
+#include <gtkmm/dialog.h>
+#include "ui/widget/spinbutton.h"
+#include "ui/widget/panel.h"
+#include "ui/widget/object-composite-settings.h"
+#include "desktop-tracker.h"
+#include "ui/widget/style-subject.h"
+#include "selection.h"
+#include "ui/widget/filter-effect-chooser.h"
+
+class SPObject;
+class SPGroup;
+struct SPColorSelector;
+
+namespace Inkscape {
+
+namespace UI {
+namespace Dialog {
+
+
+/**
+ * A panel that displays objects.
+ */
+class ObjectsPanel : public UI::Widget::Panel
+{
+public:
+ ObjectsPanel();
+ virtual ~ObjectsPanel();
+
+ static ObjectsPanel& getInstance();
+
+ void setDesktop( SPDesktop* desktop );
+ void setDocument( SPDesktop* desktop, SPDocument* document);
+
+private:
+ //Internal Classes:
+ class ModelColumns;
+ class InternalUIBounce;
+ class ObjectWatcher;
+
+ //Connections, Watchers, Trackers:
+
+ //Document root watcher
+ ObjectsPanel::ObjectWatcher* _rootWatcher;
+
+ //All object watchers
+ std::vector<ObjectsPanel::ObjectWatcher*> _objectWatchers;
+
+ //Connection for when the desktop changes
+ sigc::connection desktopChangeConn;
+
+ //Connection for when the document changes
+ sigc::connection _documentChangedConnection;
+
+ //Connection for when the active selection in the document changes
+ sigc::connection _selectionChangedConnection;
+
+ //Connection for when the selection in the dialog changes
+ sigc::connection _selectedConnection;
+
+ //Connections for when the opacity/blend/blur of the active selection in the document changes
+ sigc::connection _opacityConnection;
+ sigc::connection _blendConnection;
+ sigc::connection _blurConnection;
+
+ //Desktop tracker for grabbing the desktop changed connection
+ DesktopTracker _deskTrack;
+
+ //Members:
+
+ //The current desktop
+ SPDesktop* _desktop;
+
+ //The current document
+ SPDocument* _document;
+
+ //Tree data model
+ ModelColumns* _model;
+
+ //Prevents the composite controls from updating
+ bool _blockCompositeUpdate;
+
+ //
+ InternalUIBounce* _pending;
+
+ //Whether the drag & drop was dragged into an item
+ gboolean _dnd_into;
+
+ //List of drag & drop source items
+ std::vector<SPItem*> _dnd_source;
+
+ //Drag & drop target item
+ SPItem* _dnd_target;
+
+ //List of items to change the highlight on
+ std::vector<SPItem*> _highlight_target;
+
+ //GUI Members:
+
+ GdkEvent* _toggleEvent;
+
+ Gtk::TreeModel::Path _defer_target;
+
+ Glib::RefPtr<Gtk::TreeStore> _store;
+ std::vector<Gtk::Widget*> _watching;
+ std::vector<Gtk::Widget*> _watchingNonTop;
+ std::vector<Gtk::Widget*> _watchingNonBottom;
+
+ Gtk::TreeView _tree;
+ Gtk::CellRendererText *_text_renderer;
+ Gtk::TreeView::Column *_name_column;
+#if WITH_GTKMM_3_0
+ Gtk::Box _buttonsRow;
+ Gtk::Box _buttonsPrimary;
+ Gtk::Box _buttonsSecondary;
+#else
+ Gtk::HBox _buttonsRow;
+ Gtk::HBox _buttonsPrimary;
+ Gtk::HBox _buttonsSecondary;
+#endif
+ Gtk::ScrolledWindow _scroller;
+ Gtk::Menu _popupMenu;
+ Inkscape::UI::Widget::SpinButton _spinBtn;
+ Gtk::VBox _page;
+
+ /* Composite Settings */
+ Gtk::VBox _composite_vbox;
+ Gtk::VBox _opacity_vbox;
+ Gtk::HBox _opacity_hbox;
+ Gtk::Label _opacity_label;
+ Gtk::Label _opacity_label_unit;
+#if WITH_GTKMM_3_0
+ Glib::RefPtr<Gtk::Adjustment> _opacity_adjustment;
+#else
+ Gtk::Adjustment _opacity_adjustment;
+#endif
+ Gtk::HScale _opacity_hscale;
+ Inkscape::UI::Widget::SpinButton _opacity_spin_button;
+
+ Inkscape::UI::Widget::SimpleFilterModifier _fe_cb;
+ Gtk::VBox _fe_vbox;
+ Gtk::Alignment _fe_alignment;
+ Inkscape::UI::Widget::SimpleFilterModifier _fe_blur;
+ Gtk::VBox _blur_vbox;
+ Gtk::Alignment _blur_alignment;
+
+ Gtk::Dialog _colorSelectorDialog;
+ SPColorSelector *_colorSelector;
+
+
+ //Methods:
+
+ ObjectsPanel(ObjectsPanel const &); // no copy
+ ObjectsPanel &operator=(ObjectsPanel const &); // no assign
+
+ void _styleButton( Gtk::Button& btn, char const* iconName, char const* tooltip );
+ void _fireAction( unsigned int code );
+
+ Gtk::MenuItem& _addPopupItem( SPDesktop *desktop, unsigned int code, char const* iconName, char const* fallback, int id );
+
+ void _setVisibleIter( const Gtk::TreeModel::iterator& iter, const bool visible );
+ void _setLockedIter( const Gtk::TreeModel::iterator& iter, const bool locked );
+
+ bool _handleButtonEvent(GdkEventButton *event);
+ bool _handleKeyEvent(GdkEventKey *event);
+
+ void _storeHighlightTarget(const Gtk::TreeModel::iterator& iter);
+ void _storeDragSource(const Gtk::TreeModel::iterator& iter);
+ bool _handleDragDrop(const Glib::RefPtr<Gdk::DragContext>& context, int x, int y, guint time);
+ void _handleEdited(const Glib::ustring& path, const Glib::ustring& new_text);
+ void _handleEditingCancelled();
+
+ void _doTreeMove();
+ void _renameObject(Gtk::TreeModel::Row row, const Glib::ustring& name);
+
+ void _pushTreeSelectionToCurrent();
+ void _selected_row_callback( const Gtk::TreeModel::iterator& iter, bool *setOpacity );
+
+ void _checkTreeSelection();
+
+ void _takeAction( int val );
+ bool _executeAction();
+
+ void _setExpanded( const Gtk::TreeModel::iterator& iter, const Gtk::TreeModel::Path& path, bool isexpanded );
+ void _setCollapsed(SPGroup * group);
+
+ bool _noSelection( Glib::RefPtr<Gtk::TreeModel> const & model, Gtk::TreeModel::Path const & path, bool b );
+ bool _rowSelectFunction( Glib::RefPtr<Gtk::TreeModel> const & model, Gtk::TreeModel::Path const & path, bool b );
+
+ void _compositingChanged( const Gtk::TreeModel::iterator& iter, bool *setValues );
+ void _updateComposite();
+ void _setCompositingValues(SPItem *item);
+
+ void _updateObject(SPObject *obj, bool recurse);
+ bool _checkForUpdated(const Gtk::TreeIter& iter, SPObject* obj);
+
+ void _objectsSelected(Selection *sel);
+ bool _checkForSelected(const Gtk::TreePath& path, const Gtk::TreeIter& iter, SPItem* item, bool scrollto);
+
+ void _objectsChanged(SPObject *obj);
+ void _addObject( SPObject* obj, Gtk::TreeModel::Row* parentRow );
+
+ void _opacityChangedIter(const Gtk::TreeIter& iter);
+ void _opacityValueChanged();
+
+ void _blendChangedIter(const Gtk::TreeIter& iter, Glib::ustring blendmode);
+ void _blendValueChanged();
+
+ void _blurChangedIter(const Gtk::TreeIter& iter, double blur);
+ void _blurValueChanged();
+
+
+ void setupDialog(const Glib::ustring &title);
+
+ friend void sp_highlight_picker_color_mod(SPColorSelector *csel, GObject *cp);
+
+};
+
+
+
+} //namespace Dialogs
+} //namespace UI
+} //namespace Inkscape
+
+
+
+#endif // SEEN_OBJECTS_PANEL_H
+
+/*
+ Local Variables:
+ mode:c++
+ c-file-style:"stroustrup"
+ c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
+ indent-tabs-mode:nil
+ fill-column:99
+ End:
+*/
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :
diff --git a/src/ui/dialog/ocaldialogs.cpp b/src/ui/dialog/ocaldialogs.cpp
index f676e75fd..c4dd9df98 100644
--- a/src/ui/dialog/ocaldialogs.cpp
+++ b/src/ui/dialog/ocaldialogs.cpp
@@ -25,9 +25,9 @@
#include "path-prefix.h"
#include "filedialogimpl-gtkmm.h"
-#include "interface.h"
+#include "ui/interface.h"
#include "gc-core.h"
-#include <dialogs/dialog-events.h>
+#include "ui/dialog-events.h"
#include "io/sys.h"
#include "preferences.h"
diff --git a/src/ui/dialog/ocaldialogs.h b/src/ui/dialog/ocaldialogs.h
index e21030bcd..bd028c145 100644
--- a/src/ui/dialog/ocaldialogs.h
+++ b/src/ui/dialog/ocaldialogs.h
@@ -38,8 +38,7 @@
//Inkscape includes
#include "ui/dialog/filedialog.h"
-
-#include <dialogs/dialog-events.h>
+#include "ui/dialog-events.h"
struct _xmlNode;
typedef _xmlNode xmlNode;
diff --git a/src/ui/dialog/panel-dialog.h b/src/ui/dialog/panel-dialog.h
index 1fefd811e..b4a355083 100644
--- a/src/ui/dialog/panel-dialog.h
+++ b/src/ui/dialog/panel-dialog.h
@@ -49,19 +49,19 @@ public:
virtual UI::Widget::Panel &getPanel() { return _panel; }
protected:
- static void handle_deactivate_desktop(Inkscape::Application *application, SPDesktop *desktop, void *data) {
+ static void handle_deactivate_desktop(InkscapeApplication *application, SPDesktop *desktop, void *data) {
g_return_if_fail(data != NULL);
static_cast<PanelDialogBase *>(data)->_propagateDesktopDeactivated(application, desktop);
}
- static void _handle_activate_desktop(Inkscape::Application *application, SPDesktop *desktop, void *data) {
+ static void _handle_activate_desktop(InkscapeApplication *application, SPDesktop *desktop, void *data) {
g_return_if_fail(data != NULL);
static_cast<PanelDialogBase *>(data)->_propagateDesktopActivated(application, desktop);
}
inline virtual void _propagateDocumentReplaced(SPDesktop* desktop, SPDocument *document);
- inline virtual void _propagateDesktopActivated(Inkscape::Application *, SPDesktop *);
- inline virtual void _propagateDesktopDeactivated(Inkscape::Application *, SPDesktop *);
+ inline virtual void _propagateDesktopActivated(InkscapeApplication *, SPDesktop *);
+ inline virtual void _propagateDesktopDeactivated(InkscapeApplication *, SPDesktop *);
UI::Widget::Panel &_panel;
sigc::connection _document_replaced_connection;
@@ -134,14 +134,14 @@ void PanelDialogBase::_propagateDocumentReplaced(SPDesktop *desktop, SPDocument
_panel.signalDocumentReplaced().emit(desktop, document);
}
-void PanelDialogBase::_propagateDesktopActivated(Inkscape::Application *application, SPDesktop *desktop)
+void PanelDialogBase::_propagateDesktopActivated(InkscapeApplication *application, SPDesktop *desktop)
{
_document_replaced_connection =
desktop->connectDocumentReplaced(sigc::mem_fun(*this, &PanelDialogBase::_propagateDocumentReplaced));
_panel.signalActivateDesktop().emit(application, desktop);
}
-void PanelDialogBase::_propagateDesktopDeactivated(Inkscape::Application *application, SPDesktop *desktop)
+void PanelDialogBase::_propagateDesktopDeactivated(InkscapeApplication *application, SPDesktop *desktop)
{
_document_replaced_connection.disconnect();
_panel.signalDeactiveDesktop().emit(application, desktop);
diff --git a/src/ui/dialog/polar-arrange-tab.cpp b/src/ui/dialog/polar-arrange-tab.cpp
index a00b8fc02..80579c9d3 100644
--- a/src/ui/dialog/polar-arrange-tab.cpp
+++ b/src/ui/dialog/polar-arrange-tab.cpp
@@ -25,6 +25,7 @@
#include "desktop.h"
#include "sp-ellipse.h"
#include "sp-item-transform.h"
+#include <gtkmm/messagedialog.h>
namespace Inkscape {
namespace UI {
@@ -32,7 +33,11 @@ namespace Dialog {
PolarArrangeTab::PolarArrangeTab(ArrangeDialog *parent_)
: parent(parent_),
+#if WITH_GTKMM_3_0
+ parametersTable(),
+#else
parametersTable(3, 3, false),
+#endif
centerY("", "Y coordinate of the center", UNIT_TYPE_LINEAR),
centerX("", "X coordinate of the center", centerY),
radiusY("", "Y coordinate of the radius", UNIT_TYPE_LINEAR),
@@ -76,7 +81,11 @@ PolarArrangeTab::PolarArrangeTab(ArrangeDialog *parent_)
pack_start(arrangeOnParametersRadio, false, false);
centerLabel.set_text(_("Center X/Y:"));
+#if WITH_GTKMM_3_0
+ parametersTable.attach(centerLabel, 0, 0, 1, 1);
+#else
parametersTable.attach(centerLabel, 0, 1, 0, 1, Gtk::FILL);
+#endif
centerX.setDigits(2);
centerX.setIncrements(0.2, 0);
centerX.setRange(-10000, 10000);
@@ -85,11 +94,20 @@ PolarArrangeTab::PolarArrangeTab(ArrangeDialog *parent_)
centerY.setIncrements(0.2, 0);
centerY.setRange(-10000, 10000);
centerY.setValue(0, "px");
+#if WITH_GTKMM_3_0
+ parametersTable.attach(centerX, 1, 0, 1, 1);
+ parametersTable.attach(centerY, 2, 0, 1, 1);
+#else
parametersTable.attach(centerX, 1, 2, 0, 1, Gtk::FILL);
parametersTable.attach(centerY, 2, 3, 0, 1, Gtk::FILL);
+#endif
radiusLabel.set_text(_("Radius X/Y:"));
+#if WITH_GTKMM_3_0
+ parametersTable.attach(radiusLabel, 0, 1, 1, 1);
+#else
parametersTable.attach(radiusLabel, 0, 1, 1, 2, Gtk::FILL);
+#endif
radiusX.setDigits(2);
radiusX.setIncrements(0.2, 0);
radiusX.setRange(0.001, 10000);
@@ -98,11 +116,20 @@ PolarArrangeTab::PolarArrangeTab(ArrangeDialog *parent_)
radiusY.setIncrements(0.2, 0);
radiusY.setRange(0.001, 10000);
radiusY.setValue(100, "px");
+#if WITH_GTKMM_3_0
+ parametersTable.attach(radiusX, 1, 1, 1, 1);
+ parametersTable.attach(radiusY, 2, 1, 1, 1);
+#else
parametersTable.attach(radiusX, 1, 2, 1, 2, Gtk::FILL);
parametersTable.attach(radiusY, 2, 3, 1, 2, Gtk::FILL);
+#endif
angleLabel.set_text(_("Angle X/Y:"));
+#if WITH_GTKMM_3_0
+ parametersTable.attach(angleLabel, 0, 2, 1, 1);
+#else
parametersTable.attach(angleLabel, 0, 1, 2, 3, Gtk::FILL);
+#endif
angleX.setDigits(2);
angleX.setIncrements(0.2, 0);
angleX.setRange(-10000, 10000);
@@ -111,8 +138,13 @@ PolarArrangeTab::PolarArrangeTab(ArrangeDialog *parent_)
angleY.setIncrements(0.2, 0);
angleY.setRange(-10000, 10000);
angleY.setValue(180, "°");
+#if WITH_GTKMM_3_0
+ parametersTable.attach(angleX, 1, 2, 1, 1);
+ parametersTable.attach(angleY, 2, 2, 1, 1);
+#else
parametersTable.attach(angleX, 1, 2, 2, 3, Gtk::FILL);
parametersTable.attach(angleY, 2, 3, 2, 3, Gtk::FILL);
+#endif
pack_start(parametersTable, false, false);
rotateObjectsCheckBox.set_label(_("Rotate objects"));
diff --git a/src/ui/dialog/polar-arrange-tab.h b/src/ui/dialog/polar-arrange-tab.h
index f6c3b2906..f7d7bf11f 100644
--- a/src/ui/dialog/polar-arrange-tab.h
+++ b/src/ui/dialog/polar-arrange-tab.h
@@ -10,9 +10,22 @@
#ifndef INKSCAPE_UI_DIALOG_POLAR_ARRANGE_TAB_H
#define INKSCAPE_UI_DIALOG_POLAR_ARRANGE_TAB_H
+#if HAVE_CONFIG_H
+ #include "config.h"
+#endif
+
+#include "ui/widget/scalar-unit.h"
#include "ui/widget/anchor-selector.h"
#include "ui/dialog/arrange-tab.h"
-#include "ui/widget/scalar-unit.h"
+
+#include <gtkmm/radiobutton.h>
+#include <gtkmm/radiobuttongroup.h>
+
+#if WITH_GTKMM_3_0
+ #include <gtkmm/grid.h>
+#else
+ #include <gtkmm/table.h>
+#endif
namespace Inkscape {
namespace UI {
@@ -62,7 +75,11 @@ private:
Gtk::RadioButton arrangeOnLastCircleRadio;
Gtk::RadioButton arrangeOnParametersRadio;
+#if WITH_GTKMM_3_0
+ Gtk::Grid parametersTable;
+#else
Gtk::Table parametersTable;
+#endif
Gtk::Label centerLabel;
Inkscape::UI::Widget::ScalarUnit centerY;
diff --git a/src/ui/dialog/spellcheck.cpp b/src/ui/dialog/spellcheck.cpp
index 8a4ddc57e..9faa8a2cb 100644
--- a/src/ui/dialog/spellcheck.cpp
+++ b/src/ui/dialog/spellcheck.cpp
@@ -23,9 +23,9 @@
#include "selection.h"
#include "desktop.h"
#include "desktop-handles.h"
-#include "tools-switch.h"
+#include "ui/tools-switch.h"
#include "ui/tools/text-tool.h"
-#include "interface.h"
+#include "ui/interface.h"
#include "preferences.h"
#include "sp-text.h"
#include "sp-flowtext.h"
@@ -347,7 +347,7 @@ SpellCheck::init(SPDesktop *d)
char *slashPos = strrchr(exeName, '\\');
if (slashPos)
*slashPos = '\0';
- g_print ("%s\n", exeName);
+ //g_print ("Aspell prefix path: %s\n", exeName);
#endif
_stops = 0;
@@ -356,54 +356,54 @@ SpellCheck::init(SPDesktop *d)
#ifdef HAVE_ASPELL
{
- AspellConfig *config = new_aspell_config();
+ AspellConfig *config = new_aspell_config();
#ifdef WIN32
- aspell_config_replace(config, "prefix", exeName);
+ aspell_config_replace(config, "prefix", exeName);
#endif
- aspell_config_replace(config, "lang", _lang.c_str());
- aspell_config_replace(config, "encoding", "UTF-8");
- AspellCanHaveError *ret = new_aspell_speller(config);
- delete_aspell_config(config);
- if (aspell_error(ret) != 0) {
- g_warning("Error: %s\n", aspell_error_message(ret));
- delete_aspell_can_have_error(ret);
- return false;
- }
- _speller = to_aspell_speller(ret);
+ aspell_config_replace(config, "lang", _lang.c_str());
+ aspell_config_replace(config, "encoding", "UTF-8");
+ AspellCanHaveError *ret = new_aspell_speller(config);
+ delete_aspell_config(config);
+ if (aspell_error(ret) != 0) {
+ g_warning("Error: %s\n", aspell_error_message(ret));
+ delete_aspell_can_have_error(ret);
+ return false;
+ }
+ _speller = to_aspell_speller(ret);
}
if (_lang2 != "") {
- AspellConfig *config = new_aspell_config();
+ AspellConfig *config = new_aspell_config();
#ifdef WIN32
- aspell_config_replace(config, "prefix", exeName);
+ aspell_config_replace(config, "prefix", exeName);
#endif
- aspell_config_replace(config, "lang", _lang2.c_str());
- aspell_config_replace(config, "encoding", "UTF-8");
- AspellCanHaveError *ret = new_aspell_speller(config);
- delete_aspell_config(config);
- if (aspell_error(ret) != 0) {
- g_warning("Error: %s\n", aspell_error_message(ret));
- delete_aspell_can_have_error(ret);
- return false;
- }
- _speller2 = to_aspell_speller(ret);
+ aspell_config_replace(config, "lang", _lang2.c_str());
+ aspell_config_replace(config, "encoding", "UTF-8");
+ AspellCanHaveError *ret = new_aspell_speller(config);
+ delete_aspell_config(config);
+ if (aspell_error(ret) != 0) {
+ g_warning("Error: %s\n", aspell_error_message(ret));
+ delete_aspell_can_have_error(ret);
+ return false;
+ }
+ _speller2 = to_aspell_speller(ret);
}
if (_lang3 != "") {
- AspellConfig *config = new_aspell_config();
+ AspellConfig *config = new_aspell_config();
#ifdef WIN32
- aspell_config_replace(config, "prefix", exeName);
+ aspell_config_replace(config, "prefix", exeName);
#endif
- aspell_config_replace(config, "lang", _lang3.c_str());
- aspell_config_replace(config, "encoding", "UTF-8");
- AspellCanHaveError *ret = new_aspell_speller(config);
- delete_aspell_config(config);
- if (aspell_error(ret) != 0) {
- g_warning("Error: %s\n", aspell_error_message(ret));
- delete_aspell_can_have_error(ret);
- return false;
- }
- _speller3 = to_aspell_speller(ret);
+ aspell_config_replace(config, "lang", _lang3.c_str());
+ aspell_config_replace(config, "encoding", "UTF-8");
+ AspellCanHaveError *ret = new_aspell_speller(config);
+ delete_aspell_config(config);
+ if (aspell_error(ret) != 0) {
+ g_warning("Error: %s\n", aspell_error_message(ret));
+ delete_aspell_can_have_error(ret);
+ return false;
+ }
+ _speller3 = to_aspell_speller(ret);
}
#endif /* HAVE_ASPELL */
diff --git a/src/ui/dialog/swatches.cpp b/src/ui/dialog/swatches.cpp
index 4f0cb211a..a3cfeeba8 100644
--- a/src/ui/dialog/swatches.cpp
+++ b/src/ui/dialog/swatches.cpp
@@ -745,11 +745,10 @@ void SwatchesPanel::setDesktop( SPDesktop* desktop )
class DocTrack
{
public:
- DocTrack(SPDocument *doc, sigc::connection &docDestroy, sigc::connection &gradientRsrcChanged, sigc::connection &defsChanged, sigc::connection &defsModified) :
- doc(doc),
+ DocTrack(SPDocument *doc, sigc::connection &gradientRsrcChanged, sigc::connection &defsChanged, sigc::connection &defsModified) :
+ doc(doc->doRef()),
updatePending(false),
lastGradientUpdate(0.0),
- docDestroy(docDestroy),
gradientRsrcChanged(gradientRsrcChanged),
defsChanged(defsChanged),
defsModified(defsModified)
@@ -774,10 +773,10 @@ public:
}
}
if (doc) {
- docDestroy.disconnect();
gradientRsrcChanged.disconnect();
defsChanged.disconnect();
defsModified.disconnect();
+ doc->doUnref();
doc = NULL;
}
}
@@ -798,7 +797,6 @@ public:
SPDocument *doc;
bool updatePending;
double lastGradientUpdate;
- sigc::connection docDestroy;
sigc::connection gradientRsrcChanged;
sigc::connection defsChanged;
sigc::connection defsModified;
@@ -894,12 +892,11 @@ void SwatchesPanel::_trackDocument( SwatchesPanel *panel, SPDocument *document )
}
docPerPanel[panel] = document;
if (!found) {
- sigc::connection conn0 = document->connectDestroy(sigc::bind(sigc::ptr_fun(&SwatchesPanel::handleDocumentDestroy), document));
sigc::connection conn1 = document->connectResourcesChanged( "gradient", sigc::bind(sigc::ptr_fun(&SwatchesPanel::handleGradientsChange), document) );
sigc::connection conn2 = document->getDefs()->connectRelease( sigc::hide(sigc::bind(sigc::ptr_fun(&SwatchesPanel::handleDefsModified), document)) );
sigc::connection conn3 = document->getDefs()->connectModified( sigc::hide(sigc::hide(sigc::bind(sigc::ptr_fun(&SwatchesPanel::handleDefsModified), document))) );
- DocTrack *dt = new DocTrack(document, conn0, conn1, conn2, conn3);
+ DocTrack *dt = new DocTrack(document, conn1, conn2, conn3);
docTrackings.push_back(dt);
if (docPalettes.find(document) == docPalettes.end()) {
@@ -928,13 +925,11 @@ static void recalcSwatchContents(SPDocument* doc,
{
std::vector<SPGradient*> newList;
- if (doc) {
- const GSList *gradients = doc->getResourceList("gradient");
- for (const GSList *item = gradients; item; item = item->next) {
- SPGradient* grad = SP_GRADIENT(item->data);
- if ( grad->isSwatch() ) {
- newList.push_back(SP_GRADIENT(item->data));
- }
+ const GSList *gradients = doc->getResourceList("gradient");
+ for (const GSList *item = gradients; item; item = item->next) {
+ SPGradient* grad = SP_GRADIENT(item->data);
+ if ( grad->isSwatch() ) {
+ newList.push_back(SP_GRADIENT(item->data));
}
}
@@ -973,37 +968,6 @@ static void recalcSwatchContents(SPDocument* doc,
}
}
-void SwatchesPanel::handleDocumentDestroy(SPDocument *document)
-{
- if (document) {
- for (std::vector<DocTrack*>::iterator it = docTrackings.begin(); it != docTrackings.end(); ++it){
- if ((*it)->doc == document) {
- delete *it;
- docTrackings.erase(it);
- break;
- }
- }
-
- if (docPalettes.find(document) != docPalettes.end()) {
- docPalettes.erase(document);
- }
-
- for (std::map<SwatchesPanel*, SPDocument*>::iterator it = docPerPanel.begin(); it != docPerPanel.end(); ++it) {
- if (it->second == document) {
- SwatchesPanel* swp = it->first;
- std::vector<SwatchPage*> pages = swp->_getSwatchSets();
- if ((swp->_currentIndex >= static_cast<int>(pages.size())) && (pages.size() > 0))
- {
- swp->_setSelectedIndex(swp->_getSwatchSets().size() - 1);
- }
- swp->_rebuild();
- docPerPanel.erase(it);
- break;
- }
- }
- }
-}
-
void SwatchesPanel::handleGradientsChange(SPDocument *document)
{
SwatchPage *docPalette = (docPalettes.find(document) != docPalettes.end()) ? docPalettes[document] : 0;
@@ -1178,45 +1142,38 @@ void SwatchesPanel::_handleAction( int setId, int itemId )
switch( setId ) {
case 3:
{
- _setSelectedIndex(itemId);
- }
- break;
- }
-}
+ std::vector<SwatchPage*> pages = _getSwatchSets();
+ if ( itemId >= 0 && itemId < static_cast<int>(pages.size()) ) {
+ _currentIndex = itemId;
-void SwatchesPanel::_setSelectedIndex( int index )
-{
- std::vector<SwatchPage*> pages = _getSwatchSets();
- if ( index >= 0 && index < static_cast<int>(pages.size()) ) {
- _currentIndex = index;
+ if ( !_prefs_path.empty() ) {
+ Inkscape::Preferences *prefs = Inkscape::Preferences::get();
+ prefs->setString(_prefs_path + "/palette", pages[_currentIndex]->_name);
+ }
- if ( !_prefs_path.empty() ) {
- Inkscape::Preferences *prefs = Inkscape::Preferences::get();
- prefs->setString(_prefs_path + "/palette", pages[_currentIndex]->_name);
+ _rebuild();
+ }
}
-
- _rebuild();
+ break;
}
}
void SwatchesPanel::_rebuild()
{
std::vector<SwatchPage*> pages = _getSwatchSets();
- if (_currentIndex < static_cast<int>(pages.size())) {
- SwatchPage* curr = pages[_currentIndex];
- _holder->clear();
+ SwatchPage* curr = pages[_currentIndex];
+ _holder->clear();
- if ( curr->_prefWidth > 0 ) {
- _holder->setColumnPref( curr->_prefWidth );
- }
- _holder->freezeUpdates();
- // TODO restore once 'clear' works _holder->addPreview(_clear);
- _holder->addPreview(_remove);
- for ( boost::ptr_vector<ColorItem>::iterator it = curr->_colors.begin(); it != curr->_colors.end(); ++it) {
- _holder->addPreview(&*it);
- }
- _holder->thawUpdates();
+ if ( curr->_prefWidth > 0 ) {
+ _holder->setColumnPref( curr->_prefWidth );
+ }
+ _holder->freezeUpdates();
+ // TODO restore once 'clear' works _holder->addPreview(_clear);
+ _holder->addPreview(_remove);
+ for ( boost::ptr_vector<ColorItem>::iterator it = curr->_colors.begin(); it != curr->_colors.end(); ++it) {
+ _holder->addPreview(&*it);
}
+ _holder->thawUpdates();
}
} //namespace Dialogs
diff --git a/src/ui/dialog/swatches.h b/src/ui/dialog/swatches.h
index 3abb81d98..ca4c1687d 100644
--- a/src/ui/dialog/swatches.h
+++ b/src/ui/dialog/swatches.h
@@ -43,13 +43,11 @@ public:
virtual int getSelectedIndex() {return _currentIndex;} // temporary
protected:
- static void handleDocumentDestroy(SPDocument *document);
static void handleGradientsChange(SPDocument *document);
virtual void _updateFromSelection();
virtual void _handleAction( int setId, int itemId );
virtual void _setDocument( SPDocument *document );
- virtual void _setSelectedIndex( int index );
virtual void _rebuild();
virtual std::vector<SwatchPage*> _getSwatchSets() const;
diff --git a/src/ui/dialog/tags.cpp b/src/ui/dialog/tags.cpp
new file mode 100644
index 000000000..127e4d95e
--- /dev/null
+++ b/src/ui/dialog/tags.cpp
@@ -0,0 +1,1165 @@
+/*
+ * A simple panel for tags
+ *
+ * Authors:
+ * Theodore Janeczko
+ *
+ * Copyright (C) Theodore Janeczko 2012 <flutterguy317@gmail.com>
+ *
+ * Released under GNU GPL, read the file 'COPYING' for more information
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#if WITH_GLIBMM_2_32
+# include <glibmm/threads.h>
+#endif
+
+#include "tags.h"
+#include <gtkmm/widget.h>
+#include <gtkmm/icontheme.h>
+#include <gtkmm/imagemenuitem.h>
+#include <gtkmm/separatormenuitem.h>
+
+#include <glibmm/main.h>
+#include <glibmm/i18n.h>
+
+#include "desktop.h"
+#include "desktop-style.h"
+#include "document.h"
+#include "document-undo.h"
+#include "helper/action.h"
+#include "inkscape.h"
+#include "layer-fns.h"
+#include "layer-manager.h"
+#include "preferences.h"
+#include "sp-item.h"
+#include "sp-object.h"
+#include "sp-shape.h"
+#include "svg/css-ostringstream.h"
+#include "ui/icon-names.h"
+#include "ui/widget/layertypeicon.h"
+#include "ui/widget/addtoicon.h"
+#include "verbs.h"
+#include "widgets/icon.h"
+#include "xml/node.h"
+#include "xml/node-observer.h"
+#include "xml/repr.h"
+#include "sp-root.h"
+#include "ui/tools/tool-base.h" //"event-context.h"
+#include "selection.h"
+//#include "dialogs/dialog-events.h"
+#include "widgets/sp-color-notebook.h"
+#include "style.h"
+#include "filter-chemistry.h"
+#include "filters/blend.h"
+#include "filters/gaussian-blur.h"
+#include "sp-clippath.h"
+#include "sp-mask.h"
+#include "sp-tag.h"
+#include "sp-defs.h"
+#include "sp-tag-use.h"
+#include "sp-tag-use-reference.h"
+
+//#define DUMP_LAYERS 1
+
+namespace Inkscape {
+namespace UI {
+namespace Dialog {
+
+using Inkscape::XML::Node;
+
+TagsPanel& TagsPanel::getInstance()
+{
+ return *new TagsPanel();
+}
+
+enum {
+ COL_ADD = 1
+};
+
+enum {
+ BUTTON_NEW = 0,
+ BUTTON_TOP,
+ BUTTON_BOTTOM,
+ BUTTON_UP,
+ BUTTON_DOWN,
+ BUTTON_DELETE,
+ DRAGNDROP
+};
+
+class TagsPanel::ObjectWatcher : public Inkscape::XML::NodeObserver {
+public:
+ ObjectWatcher(TagsPanel* pnl, SPObject* obj, Inkscape::XML::Node * repr) :
+ _pnl(pnl),
+ _obj(obj),
+ _repr(repr),
+ _labelAttr(g_quark_from_string("inkscape:label"))
+ {}
+
+ ObjectWatcher(TagsPanel* pnl, SPObject* obj) :
+ _pnl(pnl),
+ _obj(obj),
+ _repr(obj->getRepr()),
+ _labelAttr(g_quark_from_string("inkscape:label"))
+ {}
+
+ virtual void notifyChildAdded( Node &/*node*/, Node &/*child*/, Node */*prev*/ )
+ {
+ if ( _pnl && _obj ) {
+ _pnl->_objectsChanged( _obj );
+ }
+ }
+ virtual void notifyChildRemoved( Node &/*node*/, Node &/*child*/, Node */*prev*/ )
+ {
+ if ( _pnl && _obj ) {
+ _pnl->_objectsChanged( _obj );
+ }
+ }
+ virtual void notifyChildOrderChanged( Node &/*node*/, Node &/*child*/, Node */*old_prev*/, Node */*new_prev*/ )
+ {
+ if ( _pnl && _obj ) {
+ _pnl->_objectsChanged( _obj );
+ }
+ }
+ virtual void notifyContentChanged( Node &/*node*/, Util::ptr_shared<char> /*old_content*/, Util::ptr_shared<char> /*new_content*/ ) {}
+ virtual void notifyAttributeChanged( Node &/*node*/, GQuark name, Util::ptr_shared<char> /*old_value*/, Util::ptr_shared<char> /*new_value*/ ) {
+ if ( _pnl && _obj ) {
+ if ( name == _labelAttr ) {
+ _pnl->_updateObject( _obj);
+ }
+ }
+ }
+
+ TagsPanel* _pnl;
+ SPObject* _obj;
+ Inkscape::XML::Node* _repr;
+ GQuark _labelAttr;
+};
+
+class TagsPanel::InternalUIBounce
+{
+public:
+ int _actionCode;
+};
+
+void TagsPanel::_styleButton( Gtk::Button& btn, SPDesktop *desktop, unsigned int code, char const* iconName, char const* tooltip )
+{
+ bool set = false;
+
+ if ( iconName ) {
+ GtkWidget *child = sp_icon_new( Inkscape::ICON_SIZE_SMALL_TOOLBAR, iconName );
+ gtk_widget_show( child );
+ btn.add( *manage(Glib::wrap(child)) );
+ btn.set_relief(Gtk::RELIEF_NONE);
+ set = true;
+ }
+
+ if ( desktop ) {
+ Verb *verb = Verb::get( code );
+ if ( verb ) {
+ SPAction *action = verb->get_action(desktop);
+ if ( !set && action && action->image ) {
+ GtkWidget *child = sp_icon_new( Inkscape::ICON_SIZE_SMALL_TOOLBAR, action->image );
+ gtk_widget_show( child );
+ btn.add( *manage(Glib::wrap(child)) );
+ set = true;
+ }
+ }
+ }
+
+ btn.set_tooltip_text (tooltip);
+}
+
+
+Gtk::MenuItem& TagsPanel::_addPopupItem( SPDesktop *desktop, unsigned int code, char const* iconName, char const* fallback, int id )
+{
+ GtkWidget* iconWidget = 0;
+ const char* label = 0;
+
+ if ( iconName ) {
+ iconWidget = sp_icon_new( Inkscape::ICON_SIZE_MENU, iconName );
+ }
+
+ if ( desktop ) {
+ Verb *verb = Verb::get( code );
+ if ( verb ) {
+ SPAction *action = verb->get_action(desktop);
+ if ( !iconWidget && action && action->image ) {
+ iconWidget = sp_icon_new( Inkscape::ICON_SIZE_MENU, action->image );
+ }
+
+ if ( action ) {
+ label = action->name;
+ }
+ }
+ }
+
+ if ( !label && fallback ) {
+ label = fallback;
+ }
+
+ Gtk::Widget* wrapped = 0;
+ if ( iconWidget ) {
+ wrapped = manage(Glib::wrap(iconWidget));
+ wrapped->show();
+ }
+
+
+ Gtk::MenuItem* item = 0;
+
+ if (wrapped) {
+ item = Gtk::manage(new Gtk::ImageMenuItem(*wrapped, label, true));
+ } else {
+ item = Gtk::manage(new Gtk::MenuItem(label, true));
+ }
+
+ item->signal_activate().connect(sigc::bind(sigc::mem_fun(*this, &TagsPanel::_takeAction), id));
+ _popupMenu.append(*item);
+
+ return *item;
+}
+
+void TagsPanel::_fireAction( unsigned int code )
+{
+ if ( _desktop ) {
+ Verb *verb = Verb::get( code );
+ if ( verb ) {
+ SPAction *action = verb->get_action(_desktop);
+ if ( action ) {
+ sp_action_perform( action, NULL );
+ }
+ }
+ }
+}
+
+void TagsPanel::_takeAction( int val )
+{
+ if ( !_pending ) {
+ _pending = new InternalUIBounce();
+ _pending->_actionCode = val;
+ Glib::signal_timeout().connect( sigc::mem_fun(*this, &TagsPanel::_executeAction), 0 );
+ }
+}
+
+bool TagsPanel::_executeAction()
+{
+ // Make sure selected layer hasn't changed since the action was triggered
+ if ( _pending)
+ {
+ int val = _pending->_actionCode;
+// SPObject* target = _pending->_target;
+ bool empty = _desktop->selection->isEmpty();
+
+ switch ( val ) {
+ case BUTTON_NEW:
+ {
+ _fireAction( SP_VERB_TAG_NEW );
+ }
+ break;
+ case BUTTON_TOP:
+ {
+ _fireAction( empty ? SP_VERB_LAYER_TO_TOP : SP_VERB_SELECTION_TO_FRONT);
+ }
+ break;
+ case BUTTON_BOTTOM:
+ {
+ _fireAction( empty ? SP_VERB_LAYER_TO_BOTTOM : SP_VERB_SELECTION_TO_BACK );
+ }
+ break;
+ case BUTTON_UP:
+ {
+ _fireAction( empty ? SP_VERB_LAYER_RAISE : SP_VERB_SELECTION_RAISE );
+ }
+ break;
+ case BUTTON_DOWN:
+ {
+ _fireAction( empty ? SP_VERB_LAYER_LOWER : SP_VERB_SELECTION_LOWER );
+ }
+ break;
+ case BUTTON_DELETE:
+ {
+ std::vector<SPObject *> todelete;
+ _tree.get_selection()->selected_foreach_iter(sigc::bind<std::vector<SPObject *>*>(sigc::mem_fun(*this, &TagsPanel::_checkForDeleted), &todelete));
+ for (std::vector<SPObject *>::iterator iter = todelete.begin(); iter != todelete.end(); ++iter) {
+ SPObject * obj = *iter;
+ if (obj && obj->parent && obj->getRepr() && obj->parent->getRepr()) {
+ //obj->parent->getRepr()->removeChild(obj->getRepr());
+ obj->deleteObject(true, true);
+ }
+ }
+ DocumentUndo::done(_document, SP_VERB_DIALOG_TAGS, _("Remove from selection set"));
+ }
+ break;
+ case DRAGNDROP:
+ {
+ _doTreeMove( );
+ }
+ break;
+ }
+
+ delete _pending;
+ _pending = 0;
+ }
+
+ return false;
+}
+
+
+class TagsPanel::ModelColumns : public Gtk::TreeModel::ColumnRecord
+{
+public:
+
+ ModelColumns()
+ {
+ add(_colParentObject);
+ add(_colObject);
+ add(_colLabel);
+ add(_colAddRemove);
+ add(_colAllowAddRemove);
+ }
+ virtual ~ModelColumns() {}
+
+ Gtk::TreeModelColumn<SPObject*> _colParentObject;
+ Gtk::TreeModelColumn<SPObject*> _colObject;
+ Gtk::TreeModelColumn<Glib::ustring> _colLabel;
+ Gtk::TreeModelColumn<bool> _colAddRemove;
+ Gtk::TreeModelColumn<bool> _colAllowAddRemove;
+};
+
+void TagsPanel::_checkForDeleted(const Gtk::TreeIter& iter, std::vector<SPObject *>* todelete)
+{
+ Gtk::TreeRow row = *iter;
+ SPObject * obj = row[_model->_colObject];
+ if (obj && obj->parent) {
+ todelete->push_back(obj);
+ }
+}
+
+void TagsPanel::_updateObject( SPObject *obj ) {
+ _store->foreach( sigc::bind<SPObject*>(sigc::mem_fun(*this, &TagsPanel::_checkForUpdated), obj) );
+}
+
+bool TagsPanel::_checkForUpdated(const Gtk::TreePath &/*path*/, const Gtk::TreeIter& iter, SPObject* obj)
+{
+ Gtk::TreeModel::Row row = *iter;
+ if ( obj == row[_model->_colObject] )
+ {
+ /*
+ * We get notified of layer update here (from layer->setLabel()) before layer->label() is set
+ * with the correct value (sp-object bug?). So use the inkscape:label attribute instead which
+ * has the correct value (bug #168351)
+ */
+ //row[_model->_colLabel] = layer->label() ? layer->label() : layer->getId();
+ gchar const *label;
+ SPTagUse * use = SP_IS_TAG_USE(obj) ? SP_TAG_USE(obj) : 0;
+ if (use && use->ref->isAttached()) {
+ label = use->ref->getObject()->getAttribute("inkscape:label");
+ } else {
+ label = obj->getAttribute("inkscape:label");
+ }
+ row[_model->_colLabel] = label ? label : obj->getId();
+ row[_model->_colAddRemove] = SP_IS_TAG(obj);
+ }
+
+ return false;
+}
+
+void TagsPanel::_objectsSelected( Selection *sel ) {
+
+ _selectedConnection.block();
+ _tree.get_selection()->unselect_all();
+ for (const GSList * iter = sel->list(); iter != NULL; iter = iter->next)
+ {
+ SPObject *obj = reinterpret_cast<SPObject *>(iter->data);
+ _store->foreach(sigc::bind<SPObject *>( sigc::mem_fun(*this, &TagsPanel::_checkForSelected), obj));
+ }
+ _selectedConnection.unblock();
+ _checkTreeSelection();
+}
+
+bool TagsPanel::_checkForSelected(const Gtk::TreePath &path, const Gtk::TreeIter& iter, SPObject* obj)
+{
+ Gtk::TreeModel::Row row = *iter;
+ SPObject * it = row[_model->_colObject];
+ if ( it && SP_IS_TAG_USE(it) && SP_TAG_USE(it)->ref->getObject() == obj )
+ {
+ Glib::RefPtr<Gtk::TreeSelection> select = _tree.get_selection();
+
+ select->select(iter);
+ }
+ return false;
+}
+
+void TagsPanel::_objectsChanged(SPObject* root)
+{
+ while (!_objectWatchers.empty())
+ {
+ TagsPanel::ObjectWatcher *w = _objectWatchers.back();
+ w->_repr->removeObserver(*w);
+ _objectWatchers.pop_back();
+ delete w;
+ }
+
+ if (_desktop) {
+ SPDocument* document = _desktop->doc();
+ SPDefs* root = document->getDefs();
+ if ( root ) {
+ _selectedConnection.block();
+ _store->clear();
+ _addObject( document, root, 0 );
+ _selectedConnection.unblock();
+ _objectsSelected(_desktop->selection);
+ _checkTreeSelection();
+ }
+ }
+}
+
+void TagsPanel::_addObject( SPDocument* doc, SPObject* obj, Gtk::TreeModel::Row* parentRow )
+{
+ if ( _desktop && obj ) {
+ for ( SPObject *child = obj->children; child != NULL; child = child->next) {
+ if (SP_IS_TAG(child))
+ {
+ Gtk::TreeModel::iterator iter = parentRow ? _store->prepend(parentRow->children()) : _store->prepend();
+ Gtk::TreeModel::Row row = *iter;
+ row[_model->_colObject] = child;
+ row[_model->_colParentObject] = NULL;
+ row[_model->_colLabel] = child->label() ? child->label() : child->getId();
+ row[_model->_colAddRemove] = true;
+ row[_model->_colAllowAddRemove] = true;
+
+ _tree.expand_to_path( _store->get_path(iter) );
+
+ TagsPanel::ObjectWatcher *w = new TagsPanel::ObjectWatcher(this, child);
+ child->getRepr()->addObserver(*w);
+ _objectWatchers.push_back(w);
+ _addObject( doc, child, &row );
+ }
+ }
+ if (SP_IS_TAG(obj) && obj->children)
+ {
+ Gtk::TreeModel::iterator iteritems = parentRow ? _store->append(parentRow->children()) : _store->prepend();
+ Gtk::TreeModel::Row rowitems = *iteritems;
+ rowitems[_model->_colObject] = NULL;
+ rowitems[_model->_colParentObject] = obj;
+ rowitems[_model->_colLabel] = _("Items");
+ rowitems[_model->_colAddRemove] = false;
+ rowitems[_model->_colAllowAddRemove] = false;
+
+ _tree.expand_to_path( _store->get_path(iteritems) );
+
+ for ( SPObject *child = obj->children; child != NULL; child = child->next) {
+ if (SP_IS_TAG_USE(child))
+ {
+ SPItem *item = SP_TAG_USE(child)->ref->getObject();
+ Gtk::TreeModel::iterator iter = _store->prepend(rowitems->children());
+ Gtk::TreeModel::Row row = *iter;
+ row[_model->_colObject] = child;
+ row[_model->_colParentObject] = NULL;
+ row[_model->_colLabel] = item ? (item->label() ? item->label() : item->getId()) : SP_TAG_USE(child)->href;
+ row[_model->_colAddRemove] = false;
+ row[_model->_colAllowAddRemove] = true;
+
+ if (SP_TAG(obj)->expanded()) {
+ _tree.expand_to_path( _store->get_path(iter) );
+ }
+
+ if (item) {
+ TagsPanel::ObjectWatcher *w = new TagsPanel::ObjectWatcher(this, child, item->getRepr());
+ item->getRepr()->addObserver(*w);
+ _objectWatchers.push_back(w);
+ }
+ }
+ }
+ }
+ }
+}
+
+void TagsPanel::_select_tag( SPTag * tag )
+{
+ for (SPObject * child = tag->children; child != NULL; child = child->next)
+ {
+ if (SP_IS_TAG(child)) {
+ _select_tag(SP_TAG(child));
+ } else if (SP_IS_TAG_USE(child)) {
+ SPObject * obj = SP_TAG_USE(child)->ref->getObject();
+ if (obj) {
+ if (_desktop->selection->isEmpty()) _desktop->setCurrentLayer(obj->parent);
+ _desktop->selection->add(obj);
+ }
+ }
+ }
+}
+
+void TagsPanel::_selected_row_callback( const Gtk::TreeModel::iterator& iter )
+{
+ if (iter) {
+ Gtk::TreeModel::Row row = *iter;
+ SPObject *obj = row[_model->_colObject];
+ if (obj) {
+ if (SP_IS_TAG(obj)) {
+ _select_tag(SP_TAG(obj));
+ } else if (SP_IS_TAG_USE(obj)) {
+ SPObject * item = SP_TAG_USE(obj)->ref->getObject();
+ if (item) {
+ if (_desktop->selection->isEmpty()) _desktop->setCurrentLayer(item->parent);
+ _desktop->selection->add(item);
+ }
+ }
+ }
+ }
+}
+
+void TagsPanel::_pushTreeSelectionToCurrent()
+{
+ _selectionChangedConnection.block();
+ // TODO hunt down the possible API abuse in getting NULL
+ if ( _desktop && _desktop->currentRoot() ) {
+ _desktop->selection->clear();
+ _tree.get_selection()->selected_foreach_iter( sigc::mem_fun(*this, &TagsPanel::_selected_row_callback));
+ }
+ _selectionChangedConnection.unblock();
+
+ _checkTreeSelection();
+}
+
+void TagsPanel::_checkTreeSelection()
+{
+ bool sensitive = _tree.get_selection()->count_selected_rows() > 0;
+ bool sensitiveNonTop = true;
+ bool sensitiveNonBottom = true;
+// if ( _tree.get_selection()->count_selected_rows() > 0 ) {
+// sensitive = true;
+//
+// SPObject* inTree = _selectedLayer();
+// if ( inTree ) {
+//
+// sensitiveNonTop = (Inkscape::Nex(inTree->parent, inTree) != 0);
+// sensitiveNonBottom = (Inkscape::previous_layer(inTree->parent, inTree) != 0);
+//
+// }
+// }
+
+
+ for ( std::vector<Gtk::Widget*>::iterator it = _watching.begin(); it != _watching.end(); ++it ) {
+ (*it)->set_sensitive( sensitive );
+ }
+ for ( std::vector<Gtk::Widget*>::iterator it = _watchingNonTop.begin(); it != _watchingNonTop.end(); ++it ) {
+ (*it)->set_sensitive( sensitiveNonTop );
+ }
+ for ( std::vector<Gtk::Widget*>::iterator it = _watchingNonBottom.begin(); it != _watchingNonBottom.end(); ++it ) {
+ (*it)->set_sensitive( sensitiveNonBottom );
+ }
+}
+
+bool TagsPanel::_handleKeyEvent(GdkEventKey *event)
+{
+
+ switch (Inkscape::UI::Tools::get_group0_keyval(event)) {
+ case GDK_KEY_Return:
+ case GDK_KEY_KP_Enter:
+ case GDK_KEY_F2: {
+ Gtk::TreeModel::iterator iter = _tree.get_selection()->get_selected();
+ if (iter && !_text_renderer->property_editable()) {
+ Gtk::TreeRow row = *iter;
+ SPObject * obj = row[_model->_colObject];
+ if (obj && SP_IS_TAG(obj)) {
+ Gtk::TreeModel::Path *path = new Gtk::TreeModel::Path(iter);
+ // Edit the layer label
+ _text_renderer->property_editable() = true;
+ _tree.set_cursor(*path, *_name_column, true);
+ grab_focus();
+ return true;
+ }
+ }
+ }
+ case GDK_KEY_Delete: {
+ std::vector<SPObject *> todelete;
+ _tree.get_selection()->selected_foreach_iter(sigc::bind<std::vector<SPObject *>*>(sigc::mem_fun(*this, &TagsPanel::_checkForDeleted), &todelete));
+ if (!todelete.empty()) {
+ for (std::vector<SPObject *>::iterator iter = todelete.begin(); iter != todelete.end(); ++iter) {
+ SPObject * obj = *iter;
+ if (obj && obj->parent && obj->getRepr() && obj->parent->getRepr()) {
+ //obj->parent->getRepr()->removeChild(obj->getRepr());
+ obj->deleteObject(true, true);
+ }
+ }
+ DocumentUndo::done(_document, SP_VERB_DIALOG_TAGS, _("Remove from selection set"));
+ }
+ return true;
+ }
+ break;
+ }
+ return false;
+}
+
+bool TagsPanel::_handleButtonEvent(GdkEventButton* event)
+{
+ static unsigned doubleclick = 0;
+
+ if ( (event->type == GDK_BUTTON_PRESS) && (event->button == 3) ) {
+ // TODO - fix to a better is-popup function
+ Gtk::TreeModel::Path path;
+ int x = static_cast<int>(event->x);
+ int y = static_cast<int>(event->y);
+ if ( _tree.get_path_at_pos( x, y, path ) ) {
+ _checkTreeSelection();
+ _popupMenu.popup(event->button, event->time);
+ if (_tree.get_selection()->is_selected(path)) {
+ return true;
+ }
+ }
+ }
+
+ if ( (event->type == GDK_BUTTON_PRESS) && (event->button == 1)) {
+ // Alt left click on the visible/lock columns - eat this event to keep row selection
+ Gtk::TreeModel::Path path;
+ Gtk::TreeViewColumn* col = 0;
+ int x = static_cast<int>(event->x);
+ int y = static_cast<int>(event->y);
+ int x2 = 0;
+ int y2 = 0;
+ if ( _tree.get_path_at_pos( x, y, path, col, x2, y2 ) ) {
+ if (col == _tree.get_column(COL_ADD-1)) {
+ down_at_add = true;
+ return true;
+ } else if ( !(event->state & (GDK_SHIFT_MASK | GDK_CONTROL_MASK)) & _tree.get_selection()->is_selected(path) ) {
+ _tree.get_selection()->set_select_function(sigc::mem_fun(*this, &TagsPanel::_noSelection));
+ _defer_target = path;
+ } else {
+ down_at_add = false;
+ }
+ } else {
+ down_at_add = false;
+ }
+ }
+
+ if ( event->type == GDK_BUTTON_RELEASE) {
+ _tree.get_selection()->set_select_function(sigc::mem_fun(*this, &TagsPanel::_rowSelectFunction));
+ }
+
+ // TODO - ImageToggler doesn't seem to handle Shift/Alt clicks - so we deal with them here.
+ if ( (event->type == GDK_BUTTON_RELEASE) && (event->button == 1)) {
+
+ Gtk::TreeModel::Path path;
+ Gtk::TreeViewColumn* col = 0;
+ int x = static_cast<int>(event->x);
+ int y = static_cast<int>(event->y);
+ int x2 = 0;
+ int y2 = 0;
+ if ( _tree.get_path_at_pos( x, y, path, col, x2, y2 ) ) {
+ if (_defer_target) {
+ if (_defer_target == path && !(event->x == 0 && event->y == 0))
+ {
+ _tree.set_cursor(path, *col, false);
+ }
+ _defer_target = Gtk::TreeModel::Path();
+ } else {
+ Gtk::TreeModel::Children::iterator iter = _tree.get_model()->get_iter(path);
+ Gtk::TreeModel::Row row = *iter;
+
+ SPObject* obj = row[_model->_colObject];
+
+ if (obj) {
+ if (col == _tree.get_column(COL_ADD - 1) && down_at_add) {
+ if (SP_IS_TAG(obj)) {
+ bool wasadded = false;
+ for (const GSList * iter = _desktop->selection->itemList(); iter != NULL; iter = iter->next)
+ {
+ SPObject *newobj = reinterpret_cast<SPObject *>(iter->data);
+ bool addchild = true;
+ for ( SPObject *child = obj->children; child != NULL; child = child->next) {
+ if (SP_IS_TAG_USE(child) && SP_TAG_USE(child)->ref->getObject() == newobj) {
+ addchild = false;
+ }
+ }
+ if (addchild) {
+ Inkscape::XML::Node *clone = _document->getReprDoc()->createElement("inkscape:tagref");
+ clone->setAttribute("xlink:href", g_strdup_printf("#%s", newobj->getRepr()->attribute("id")), false);
+ obj->appendChild(clone);
+ wasadded = true;
+ }
+ }
+ if (wasadded) {
+ DocumentUndo::done(_document, SP_VERB_DIALOG_TAGS, _("Add selection to set"));
+ }
+ } else {
+ std::vector<SPObject *> todelete;
+ // FIXME unnecessary use of XML tree
+ _tree.get_selection()->selected_foreach_iter(sigc::bind<std::vector<SPObject *>*>(sigc::mem_fun(*this, &TagsPanel::_checkForDeleted), &todelete));
+ if (!todelete.empty()) {
+ for (std::vector<SPObject *>::iterator iter = todelete.begin(); iter != todelete.end(); ++iter) {
+ SPObject * tobj = *iter;
+ if (tobj && tobj->parent && tobj->getRepr() && tobj->parent->getRepr()) {
+ //tobj->parent->getRepr()->removeChild(tobj->getRepr());
+ tobj->deleteObject(true, true);
+ }
+ }
+ } else if (obj && obj->parent && obj->getRepr() && obj->parent->getRepr()) {
+ obj->parent->getRepr()->removeChild(obj->getRepr());
+ }
+ DocumentUndo::done(_document, SP_VERB_DIALOG_TAGS, _("Remove from selection set"));
+ }
+ }
+ }
+ }
+ }
+ }
+
+
+ if ( (event->type == GDK_2BUTTON_PRESS) && (event->button == 1) ) {
+ doubleclick = 1;
+ }
+
+ if ( event->type == GDK_BUTTON_RELEASE && doubleclick) {
+ doubleclick = 0;
+ Gtk::TreeModel::Path path;
+ Gtk::TreeViewColumn* col = 0;
+ int x = static_cast<int>(event->x);
+ int y = static_cast<int>(event->y);
+ int x2 = 0;
+ int y2 = 0;
+ if ( _tree.get_path_at_pos( x, y, path, col, x2, y2 ) && col == _name_column) {
+ Gtk::TreeModel::Children::iterator iter = _tree.get_model()->get_iter(path);
+ Gtk::TreeModel::Row row = *iter;
+
+ SPObject* obj = row[_model->_colObject];
+ if (obj && (SP_IS_TAG(obj) || (SP_IS_TAG_USE(obj) && SP_TAG_USE(obj)->ref->getObject()))) {
+ // Double click on the Layer name, enable editing
+ _text_renderer->property_editable() = true;
+ _tree.set_cursor (path, *_name_column, true);
+ grab_focus();
+ }
+ }
+ }
+
+ return false;
+}
+
+void TagsPanel::_storeDragSource(const Gtk::TreeModel::iterator& iter)
+{
+ Gtk::TreeModel::Row row = *iter;
+ SPObject* obj = row[_model->_colObject];
+ SPTag* item = ( obj && SP_IS_TAG(obj) ) ? SP_TAG(obj) : 0;
+ if (item)
+ {
+ _dnd_source.push_back(item);
+ }
+}
+
+/*
+ * Drap and drop within the tree
+ * Save the drag source and drop target SPObjects and if its a drag between layers or into (sublayer) a layer
+ */
+bool TagsPanel::_handleDragDrop(const Glib::RefPtr<Gdk::DragContext>& context, int x, int y, guint time)
+{
+ int cell_x = 0, cell_y = 0;
+ Gtk::TreeModel::Path target_path;
+ Gtk::TreeView::Column *target_column;
+
+ _dnd_into = true;
+ _dnd_target = _document->getDefs();
+ _dnd_source.clear();
+ _tree.get_selection()->selected_foreach_iter(sigc::mem_fun(*this, &TagsPanel::_storeDragSource));
+
+ if (_dnd_source.empty()) {
+ return true;
+ }
+
+ if (_tree.get_path_at_pos (x, y, target_path, target_column, cell_x, cell_y)) {
+ // Are we before, inside or after the drop layer
+ Gdk::Rectangle rect;
+ _tree.get_background_area (target_path, *target_column, rect);
+ int cell_height = rect.get_height();
+ _dnd_into = (cell_y > (int)(cell_height * 1/3) && cell_y <= (int)(cell_height * 2/3));
+ if (cell_y > (int)(cell_height * 2/3)) {
+ Gtk::TreeModel::Path next_path = target_path;
+ next_path.next();
+ if (_store->iter_is_valid(_store->get_iter(next_path))) {
+ target_path = next_path;
+ } else {
+ // Dragging to the "end"
+ Gtk::TreeModel::Path up_path = target_path;
+ up_path.up();
+ if (_store->iter_is_valid(_store->get_iter(up_path))) {
+ // Drop into parent
+ target_path = up_path;
+ _dnd_into = true;
+ } else {
+ // Drop into the top level
+ _dnd_target = _document->getDefs();
+ _dnd_into = true;
+ }
+ }
+ }
+ Gtk::TreeModel::iterator iter = _store->get_iter(target_path);
+ if (_store->iter_is_valid(iter)) {
+ Gtk::TreeModel::Row row = *iter;
+ SPObject *obj = row[_model->_colObject];
+ SPObject *pobj = row[_model->_colParentObject];
+ if (obj) {
+ if (SP_IS_TAG(obj)) {
+ _dnd_target = SP_TAG(obj);
+ } else if (SP_IS_TAG(obj->parent)) {
+ _dnd_target = SP_TAG(obj->parent);
+ _dnd_into = true;
+ }
+ } else if (pobj && SP_IS_TAG(pobj)) {
+ _dnd_target = SP_TAG(pobj);
+ _dnd_into = true;
+ } else {
+ return true;
+ }
+ }
+ }
+
+ _takeAction(DRAGNDROP);
+
+ return false;
+}
+
+/*
+ * Move a layer in response to a drag & drop action
+ */
+void TagsPanel::_doTreeMove( )
+{
+ if (_dnd_target) {
+ for (std::vector<SPTag *>::iterator iter = _dnd_source.begin(); iter != _dnd_source.end(); ++iter)
+ {
+ SPTag *src = *iter;
+ if (src != _dnd_target) {
+ src->moveTo(_dnd_target, _dnd_into);
+ }
+ }
+ _desktop->selection->clear();
+ while (!_dnd_source.empty())
+ {
+ SPTag *src = _dnd_source.back();
+ _select_tag(src);
+ _dnd_source.pop_back();
+ }
+ DocumentUndo::done( _desktop->doc() , SP_VERB_DIALOG_TAGS,
+ _("Moved sets"));
+ }
+}
+
+
+void TagsPanel::_handleEdited(const Glib::ustring& path, const Glib::ustring& new_text)
+{
+ Gtk::TreeModel::iterator iter = _tree.get_model()->get_iter(path);
+ Gtk::TreeModel::Row row = *iter;
+
+ _renameObject(row, new_text);
+ _text_renderer->property_editable() = false;
+}
+
+void TagsPanel::_handleEditingCancelled()
+{
+ _text_renderer->property_editable() = false;
+}
+
+void TagsPanel::_renameObject(Gtk::TreeModel::Row row, const Glib::ustring& name)
+{
+ if ( row && _desktop) {
+ SPObject* obj = row[_model->_colObject];
+ if ( obj ) {
+ if (SP_IS_TAG(obj)) {
+ gchar const* oldLabel = obj->label();
+ if ( !name.empty() && (!oldLabel || name != oldLabel) ) {
+ obj->setLabel(name.c_str());
+ DocumentUndo::done( _desktop->doc() , SP_VERB_NONE,
+ _("Rename object"));
+ }
+ } else if (SP_IS_TAG_USE(obj) && (obj = SP_TAG_USE(obj)->ref->getObject())) {
+ gchar const* oldLabel = obj->label();
+ if ( !name.empty() && (!oldLabel || name != oldLabel) ) {
+ obj->setLabel(name.c_str());
+ DocumentUndo::done( _desktop->doc() , SP_VERB_NONE,
+ _("Rename object"));
+ }
+ }
+ }
+ }
+}
+
+bool TagsPanel::_noSelection( Glib::RefPtr<Gtk::TreeModel> const & /*model*/, Gtk::TreeModel::Path const & /*path*/, bool currentlySelected )
+{
+ return false;
+}
+
+bool TagsPanel::_rowSelectFunction( Glib::RefPtr<Gtk::TreeModel> const & /*model*/, Gtk::TreeModel::Path const & /*path*/, bool currentlySelected )
+{
+ bool val = true;
+ if ( !currentlySelected && _toggleEvent )
+ {
+ GdkEvent* event = gtk_get_current_event();
+ if ( event ) {
+ // (keep these checks separate, so we know when to call gdk_event_free()
+ if ( event->type == GDK_BUTTON_PRESS ) {
+ GdkEventButton const* target = reinterpret_cast<GdkEventButton const*>(_toggleEvent);
+ GdkEventButton const* evtb = reinterpret_cast<GdkEventButton const*>(event);
+
+ if ( (evtb->window == target->window)
+ && (evtb->send_event == target->send_event)
+ && (evtb->time == target->time)
+ && (evtb->state == target->state)
+ )
+ {
+ // Ooooh! It's a magic one
+ val = false;
+ }
+ }
+ gdk_event_free(event);
+ }
+ }
+ return val;
+}
+
+void TagsPanel::_setExpanded(const Gtk::TreeModel::iterator& iter, const Gtk::TreeModel::Path& /*path*/, bool isexpanded)
+{
+ Gtk::TreeModel::Row row = *iter;
+
+ SPObject* obj = row[_model->_colParentObject];
+ if (obj && SP_IS_TAG(obj))
+ {
+ SP_TAG(obj)->setExpanded(isexpanded);
+ obj->updateRepr(SP_OBJECT_WRITE_NO_CHILDREN | SP_OBJECT_WRITE_EXT);
+ }
+}
+
+/**
+ * Constructor
+ */
+TagsPanel::TagsPanel() :
+ UI::Widget::Panel("", "/dialogs/tags", SP_VERB_DIALOG_TAGS),
+ _rootWatcher(0),
+ deskTrack(),
+ _desktop(0),
+ _document(0),
+ _model(0),
+ _pending(0),
+ _toggleEvent(0),
+ _defer_target(),
+ desktopChangeConn()
+{
+ //Inkscape::Preferences *prefs = Inkscape::Preferences::get();
+
+ ModelColumns *zoop = new ModelColumns();
+ _model = zoop;
+
+ _store = Gtk::TreeStore::create( *zoop );
+
+ _tree.set_model( _store );
+ _tree.set_headers_visible(false);
+ _tree.set_reorderable(true);
+ _tree.enable_model_drag_dest (Gdk::ACTION_MOVE);
+
+ Inkscape::UI::Widget::AddToIcon * addRenderer = manage( new Inkscape::UI::Widget::AddToIcon());
+ int addColNum = _tree.append_column("type", *addRenderer) - 1;
+ Gtk::TreeViewColumn *col = _tree.get_column(addColNum);
+ if ( col ) {
+ col->add_attribute( addRenderer->property_active(), _model->_colAddRemove );
+ col->add_attribute( addRenderer->property_visible(), _model->_colAllowAddRemove );
+ }
+
+ _text_renderer = manage(new Gtk::CellRendererText());
+ int nameColNum = _tree.append_column("Name", *_text_renderer) - 1;
+ _name_column = _tree.get_column(nameColNum);
+ _name_column->add_attribute(_text_renderer->property_text(), _model->_colLabel);
+
+ _tree.set_expander_column( *_tree.get_column(nameColNum) );
+
+ _tree.get_selection()->set_mode(Gtk::SELECTION_MULTIPLE);
+ _selectedConnection = _tree.get_selection()->signal_changed().connect( sigc::mem_fun(*this, &TagsPanel::_pushTreeSelectionToCurrent) );
+ _tree.get_selection()->set_select_function( sigc::mem_fun(*this, &TagsPanel::_rowSelectFunction) );
+
+ _tree.signal_drag_drop().connect( sigc::mem_fun(*this, &TagsPanel::_handleDragDrop), false);
+ _collapsedConnection = _tree.signal_row_collapsed().connect( sigc::bind<bool>(sigc::mem_fun(*this, &TagsPanel::_setExpanded), false));
+ _expandedConnection = _tree.signal_row_expanded().connect( sigc::bind<bool>(sigc::mem_fun(*this, &TagsPanel::_setExpanded), true));
+
+ _text_renderer->signal_edited().connect( sigc::mem_fun(*this, &TagsPanel::_handleEdited) );
+ _text_renderer->signal_editing_canceled().connect( sigc::mem_fun(*this, &TagsPanel::_handleEditingCancelled) );
+
+ _tree.signal_button_press_event().connect( sigc::mem_fun(*this, &TagsPanel::_handleButtonEvent), false );
+ _tree.signal_button_release_event().connect( sigc::mem_fun(*this, &TagsPanel::_handleButtonEvent), false );
+ _tree.signal_key_press_event().connect( sigc::mem_fun(*this, &TagsPanel::_handleKeyEvent), false );
+
+ _scroller.add( _tree );
+ _scroller.set_policy( Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC );
+ _scroller.set_shadow_type(Gtk::SHADOW_IN);
+ Gtk::Requisition sreq;
+#if WITH_GTKMM_3_0
+ Gtk::Requisition sreq_natural;
+ _scroller.get_preferred_size(sreq_natural, sreq);
+#else
+ sreq = _scroller.size_request();
+#endif
+ int minHeight = 70;
+ if (sreq.height < minHeight) {
+ // Set a min height to see the layers when used with Ubuntu liboverlay-scrollbar
+ _scroller.set_size_request(sreq.width, minHeight);
+ }
+
+ _layersPage.pack_start( _scroller, Gtk::PACK_EXPAND_WIDGET );
+
+ _layersPage.pack_end(_buttonsRow, Gtk::PACK_SHRINK);
+
+ _getContents()->pack_start(_layersPage, Gtk::PACK_EXPAND_WIDGET);
+
+ SPDesktop* targetDesktop = getDesktop();
+
+ Gtk::Button* btn = manage( new Gtk::Button() );
+ _styleButton( *btn, targetDesktop, SP_VERB_TAG_NEW, GTK_STOCK_ADD, _("Add a new selection set") );
+ btn->signal_clicked().connect( sigc::bind( sigc::mem_fun(*this, &TagsPanel::_takeAction), (int)BUTTON_NEW) );
+ _buttonsSecondary.pack_start(*btn, Gtk::PACK_SHRINK);
+
+// btn = manage( new Gtk::Button("Dup") );
+// btn->signal_clicked().connect( sigc::bind( sigc::mem_fun(*this, &LayersPanel::_takeAction), (int)BUTTON_DUPLICATE) );
+// _buttonsRow.add( *btn );
+
+ btn = manage( new Gtk::Button() );
+ _styleButton( *btn, targetDesktop, SP_VERB_LAYER_DELETE, GTK_STOCK_REMOVE, _("Remove Item/Set") );
+ btn->signal_clicked().connect( sigc::bind( sigc::mem_fun(*this, &TagsPanel::_takeAction), (int)BUTTON_DELETE) );
+ _watching.push_back( btn );
+ _buttonsSecondary.pack_start(*btn, Gtk::PACK_SHRINK);
+
+ _buttonsRow.pack_start(_buttonsSecondary, Gtk::PACK_EXPAND_WIDGET);
+ _buttonsRow.pack_end(_buttonsPrimary, Gtk::PACK_EXPAND_WIDGET);
+
+ // -------------------------------------------------------
+ {
+ _watching.push_back( &_addPopupItem( targetDesktop, SP_VERB_TAG_NEW, 0, "Add a new selection set", (int)BUTTON_NEW ) );
+
+ _popupMenu.show_all_children();
+ }
+ // -------------------------------------------------------
+
+
+
+ for ( std::vector<Gtk::Widget*>::iterator it = _watching.begin(); it != _watching.end(); ++it ) {
+ (*it)->set_sensitive( false );
+ }
+ for ( std::vector<Gtk::Widget*>::iterator it = _watchingNonTop.begin(); it != _watchingNonTop.end(); ++it ) {
+ (*it)->set_sensitive( false );
+ }
+ for ( std::vector<Gtk::Widget*>::iterator it = _watchingNonBottom.begin(); it != _watchingNonBottom.end(); ++it ) {
+ (*it)->set_sensitive( false );
+ }
+
+ setDesktop( targetDesktop );
+
+ show_all_children();
+
+ // restorePanelPrefs();
+
+ // Connect this up last
+ desktopChangeConn = deskTrack.connectDesktopChanged( sigc::mem_fun(*this, &TagsPanel::setDesktop) );
+ deskTrack.connect(GTK_WIDGET(gobj()));
+}
+
+TagsPanel::~TagsPanel()
+{
+
+ setDesktop(NULL);
+
+ if ( _model )
+ {
+ delete _model;
+ _model = 0;
+ }
+
+ if (_pending) {
+ delete _pending;
+ _pending = 0;
+ }
+
+ if ( _toggleEvent )
+ {
+ gdk_event_free( _toggleEvent );
+ _toggleEvent = 0;
+ }
+
+ desktopChangeConn.disconnect();
+ deskTrack.disconnect();
+}
+
+void TagsPanel::setDocument(SPDesktop* /*desktop*/, SPDocument* document)
+{
+ while (!_objectWatchers.empty())
+ {
+ TagsPanel::ObjectWatcher *w = _objectWatchers.back();
+ w->_repr->removeObserver(*w);
+ _objectWatchers.pop_back();
+ delete w;
+ }
+
+ if (_rootWatcher)
+ {
+ _rootWatcher->_repr->removeObserver(*_rootWatcher);
+ delete _rootWatcher;
+ _rootWatcher = NULL;
+ }
+
+ _document = document;
+
+ if (document && document->getDefs() && document->getDefs()->getRepr())
+ {
+ _rootWatcher = new TagsPanel::ObjectWatcher(this, document->getDefs());
+ document->getDefs()->getRepr()->addObserver(*_rootWatcher);
+ _objectsChanged(document->getDefs());
+ }
+}
+
+void TagsPanel::setDesktop( SPDesktop* desktop )
+{
+ Panel::setDesktop(desktop);
+
+ if ( desktop != _desktop ) {
+ _documentChangedConnection.disconnect();
+ _selectionChangedConnection.disconnect();
+ if ( _desktop ) {
+ _desktop = 0;
+ }
+
+ _desktop = Panel::getDesktop();
+ if ( _desktop ) {
+ //setLabel( _desktop->doc()->name );
+ _documentChangedConnection = _desktop->connectDocumentReplaced( sigc::mem_fun(*this, &TagsPanel::setDocument));
+ _selectionChangedConnection = _desktop->selection->connectChanged( sigc::mem_fun(*this, &TagsPanel::_objectsSelected));
+
+ setDocument(_desktop, _desktop->doc());
+ }
+ }
+/*
+ GSList const *layers = _desktop->doc()->getResourceList( "layer" );
+ g_message( "layers list starts at %p", layers );
+ for ( GSList const *iter=layers ; iter ; iter = iter->next ) {
+ SPObject *layer=static_cast<SPObject *>(iter->data);
+ g_message(" {%s} [%s]", layer->id, layer->label() );
+ }
+*/
+ deskTrack.setBase(desktop);
+}
+
+
+
+
+
+} //namespace Dialogs
+} //namespace UI
+} //namespace Inkscape
+
+
+/*
+ Local Variables:
+ mode:c++
+ c-file-style:"stroustrup"
+ c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
+ indent-tabs-mode:nil
+ fill-column:99
+ End:
+*/
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :
diff --git a/src/ui/dialog/tags.h b/src/ui/dialog/tags.h
new file mode 100644
index 000000000..d35dfba01
--- /dev/null
+++ b/src/ui/dialog/tags.h
@@ -0,0 +1,181 @@
+/*
+ * A simple dialog for tags UI.
+ *
+ * Authors:
+ * Theodore Janeczko
+ *
+ * Copyright (C) Theodore Janeczko 2012 <flutterguy317@gmail.com>
+ *
+ * Released under GNU GPL, read the file 'COPYING' for more information
+ */
+
+#ifndef SEEN_TAGS_PANEL_H
+#define SEEN_TAGS_PANEL_H
+
+#include <gtkmm/box.h>
+#include <gtkmm/treeview.h>
+#include <gtkmm/treestore.h>
+#include <gtkmm/scrolledwindow.h>
+#include <gtkmm/dialog.h>
+#include "ui/widget/spinbutton.h"
+#include "ui/widget/panel.h"
+#include "ui/widget/object-composite-settings.h"
+#include "desktop-tracker.h"
+#include "ui/widget/style-subject.h"
+#include "selection.h"
+#include "ui/widget/filter-effect-chooser.h"
+
+class SPObject;
+class SPTag;
+struct SPColorSelector;
+
+namespace Inkscape {
+
+namespace UI {
+namespace Dialog {
+
+
+/**
+ * A panel that displays layers.
+ */
+class TagsPanel : public UI::Widget::Panel
+{
+public:
+ TagsPanel();
+ virtual ~TagsPanel();
+
+ //virtual void setOrientation( Gtk::AnchorType how );
+
+ static TagsPanel& getInstance();
+
+ void setDesktop( SPDesktop* desktop );
+ void setDocument( SPDesktop* desktop, SPDocument* document);
+
+protected:
+ //virtual void _handleAction( int setId, int itemId );
+ friend void sp_highlight_picker_color_mod(SPColorSelector *csel, GObject *cp);
+private:
+ class ModelColumns;
+ class InternalUIBounce;
+ class ObjectWatcher;
+
+ TagsPanel(TagsPanel const &); // no copy
+ TagsPanel &operator=(TagsPanel const &); // no assign
+
+ void _styleButton( Gtk::Button& btn, SPDesktop *desktop, unsigned int code, char const* iconName, char const* tooltip );
+ void _fireAction( unsigned int code );
+ Gtk::MenuItem& _addPopupItem( SPDesktop *desktop, unsigned int code, char const* iconName, char const* fallback, int id );
+
+ bool _handleButtonEvent(GdkEventButton *event);
+ bool _handleKeyEvent(GdkEventKey *event);
+
+ void _storeDragSource(const Gtk::TreeModel::iterator& iter);
+ bool _handleDragDrop(const Glib::RefPtr<Gdk::DragContext>& context, int x, int y, guint time);
+ void _handleEdited(const Glib::ustring& path, const Glib::ustring& new_text);
+ void _handleEditingCancelled();
+
+ void _doTreeMove();
+ void _renameObject(Gtk::TreeModel::Row row, const Glib::ustring& name);
+
+ void _pushTreeSelectionToCurrent();
+ void _selected_row_callback( const Gtk::TreeModel::iterator& iter );
+ void _select_tag( SPTag * tag );
+
+ void _checkTreeSelection();
+
+ void _takeAction( int val );
+ bool _executeAction();
+
+ void _setExpanded( const Gtk::TreeModel::iterator& iter, const Gtk::TreeModel::Path& path, bool isexpanded );
+
+ bool _noSelection( Glib::RefPtr<Gtk::TreeModel> const & model, Gtk::TreeModel::Path const & path, bool b );
+ bool _rowSelectFunction( Glib::RefPtr<Gtk::TreeModel> const & model, Gtk::TreeModel::Path const & path, bool b );
+
+ void _updateObject(SPObject *obj);
+ bool _checkForUpdated(const Gtk::TreePath &path, const Gtk::TreeIter& iter, SPObject* obj);
+
+ void _objectsSelected(Selection *sel);
+ bool _checkForSelected(const Gtk::TreePath& path, const Gtk::TreeIter& iter, SPObject* layer);
+
+ void _objectsChanged(SPObject *root);
+ void _addObject( SPDocument* doc, SPObject* obj, Gtk::TreeModel::Row* parentRow );
+
+ void _checkForDeleted(const Gtk::TreeIter& iter, std::vector<SPObject *>* todelete);
+
+// std::vector<sigc::connection> groupConnections;
+ TagsPanel::ObjectWatcher* _rootWatcher;
+ std::vector<TagsPanel::ObjectWatcher*> _objectWatchers;
+
+ // Hooked to the layer manager:
+ sigc::connection _documentChangedConnection;
+ sigc::connection _selectionChangedConnection;
+
+ sigc::connection _changedConnection;
+ sigc::connection _addedConnection;
+ sigc::connection _removedConnection;
+
+ // Internal
+ sigc::connection _selectedConnection;
+ sigc::connection _expandedConnection;
+ sigc::connection _collapsedConnection;
+
+ DesktopTracker deskTrack;
+ SPDesktop* _desktop;
+ SPDocument* _document;
+ ModelColumns* _model;
+ InternalUIBounce* _pending;
+ gboolean _dnd_into;
+ std::vector<SPTag*> _dnd_source;
+ SPObject* _dnd_target;
+
+ GdkEvent* _toggleEvent;
+ bool down_at_add;
+
+ Gtk::TreeModel::Path _defer_target;
+
+ Glib::RefPtr<Gtk::TreeStore> _store;
+ std::vector<Gtk::Widget*> _watching;
+ std::vector<Gtk::Widget*> _watchingNonTop;
+ std::vector<Gtk::Widget*> _watchingNonBottom;
+
+ Gtk::TreeView _tree;
+ Gtk::CellRendererText *_text_renderer;
+ Gtk::TreeView::Column *_name_column;
+#if WITH_GTKMM_3_0
+ Gtk::Box _buttonsRow;
+ Gtk::Box _buttonsPrimary;
+ Gtk::Box _buttonsSecondary;
+#else
+ Gtk::HBox _buttonsRow;
+ Gtk::HBox _buttonsPrimary;
+ Gtk::HBox _buttonsSecondary;
+#endif
+ Gtk::ScrolledWindow _scroller;
+ Gtk::Menu _popupMenu;
+ Inkscape::UI::Widget::SpinButton _spinBtn;
+ Gtk::VBox _layersPage;
+
+ sigc::connection desktopChangeConn;
+
+};
+
+
+
+} //namespace Dialogs
+} //namespace UI
+} //namespace Inkscape
+
+
+
+#endif // SEEN_OBJECTS_PANEL_H
+
+/*
+ Local Variables:
+ mode:c++
+ c-file-style:"stroustrup"
+ c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
+ indent-tabs-mode:nil
+ fill-column:99
+ End:
+*/
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :
diff --git a/src/ui/dialog/template-load-tab.cpp b/src/ui/dialog/template-load-tab.cpp
index d75f81456..13cb01eef 100644
--- a/src/ui/dialog/template-load-tab.cpp
+++ b/src/ui/dialog/template-load-tab.cpp
@@ -24,7 +24,7 @@
#include "extension/db.h"
#include "extension/effect.h"
#include "inkscape.h"
-#include "interface.h"
+#include "ui/interface.h"
#include "file.h"
#include "path-prefix.h"
#include "preferences.h"
diff --git a/src/ui/dialog/text-edit.cpp b/src/ui/dialog/text-edit.cpp
index 9996fc0f9..0f4a6f7f1 100644
--- a/src/ui/dialog/text-edit.cpp
+++ b/src/ui/dialog/text-edit.cpp
@@ -51,7 +51,7 @@ extern "C" {
#include "ui/icon-names.h"
#include "preferences.h"
#include "verbs.h"
-#include "interface.h"
+#include "ui/interface.h"
#include "svg/css-ostringstream.h"
#include "widgets/icon.h"
#include "widgets/font-selector.h"
diff --git a/src/ui/dialog/transformation.cpp b/src/ui/dialog/transformation.cpp
index a7f0b068e..3e135b9b2 100644
--- a/src/ui/dialog/transformation.cpp
+++ b/src/ui/dialog/transformation.cpp
@@ -47,13 +47,13 @@ namespace Inkscape {
namespace UI {
namespace Dialog {
-static void on_selection_changed(Inkscape::Application */*inkscape*/, Inkscape::Selection *selection, Transformation *daad)
+static void on_selection_changed(InkscapeApplication */*inkscape*/, Inkscape::Selection *selection, Transformation *daad)
{
int page = daad->getCurrentPage();
daad->updateSelection((Inkscape::UI::Dialog::Transformation::PageType)page, selection);
}
-static void on_selection_modified( Inkscape::Application */*inkscape*/,
+static void on_selection_modified( InkscapeApplication */*inkscape*/,
Inkscape::Selection *selection,
guint /*flags*/,
Transformation *daad )
diff --git a/src/ui/dialog/xml-tree.cpp b/src/ui/dialog/xml-tree.cpp
index c87e42633..7ab6c78ba 100644
--- a/src/ui/dialog/xml-tree.cpp
+++ b/src/ui/dialog/xml-tree.cpp
@@ -24,13 +24,13 @@
#include "desktop.h"
#include "desktop-handles.h"
-#include "dialogs/dialog-events.h"
+#include "ui/dialog-events.h"
#include "document.h"
#include "document-undo.h"
#include "ui/tools/tool-base.h"
#include "helper/window.h"
#include "inkscape.h"
-#include "interface.h"
+#include "ui/interface.h"
#include "macros.h"
#include "message-context.h"
#include "message-stack.h"
diff --git a/src/draw-anchor.cpp b/src/ui/draw-anchor.cpp
index 00db936e1..84c919018 100644
--- a/src/draw-anchor.cpp
+++ b/src/ui/draw-anchor.cpp
@@ -13,7 +13,7 @@
*/
-#include "draw-anchor.h"
+#include "ui/draw-anchor.h"
#include "desktop.h"
#include "desktop-handles.h"
#include "ui/tools/tool-base.h"
@@ -30,7 +30,7 @@ using Inkscape::ControlManager;
/**
* Creates an anchor object and initializes it.
*/
-SPDrawAnchor *sp_draw_anchor_new(Inkscape::UI::Tools::FreehandBase *dc, SPCurve *curve, gboolean start, Geom::Point delta)
+SPDrawAnchor *sp_draw_anchor_new(Inkscape::UI::Tools::FreehandBase *dc, SPCurve *curve, bool start, Geom::Point delta)
{
if (SP_IS_LPETOOL_CONTEXT(dc)) {
// suppress all kinds of anchors in LPEToolContext
@@ -73,7 +73,7 @@ SPDrawAnchor *sp_draw_anchor_destroy(SPDrawAnchor *anchor)
* Test if point is near anchor, if so fill anchor on canvas and return
* pointer to it or NULL.
*/
-SPDrawAnchor *sp_draw_anchor_test(SPDrawAnchor *anchor, Geom::Point w, gboolean activate)
+SPDrawAnchor *sp_draw_anchor_test(SPDrawAnchor *anchor, Geom::Point w, bool activate)
{
SPCtrl *ctrl = SP_CTRL(anchor->ctrl);
diff --git a/src/draw-anchor.h b/src/ui/draw-anchor.h
index e7b252186..1f7b55920 100644
--- a/src/draw-anchor.h
+++ b/src/ui/draw-anchor.h
@@ -5,7 +5,6 @@
* Drawing anchors.
*/
-#include <glib.h>
#include <2geom/point.h>
namespace Inkscape {
@@ -26,17 +25,17 @@ struct SPCanvasItem;
struct SPDrawAnchor {
Inkscape::UI::Tools::FreehandBase *dc;
SPCurve *curve;
- guint start : 1;
- guint active : 1;
+ unsigned int start : 1;
+ unsigned int active : 1;
Geom::Point dp;
SPCanvasItem *ctrl;
};
-SPDrawAnchor *sp_draw_anchor_new(Inkscape::UI::Tools::FreehandBase *dc, SPCurve *curve, gboolean start,
+SPDrawAnchor *sp_draw_anchor_new(Inkscape::UI::Tools::FreehandBase *dc, SPCurve *curve, bool start,
Geom::Point delta);
SPDrawAnchor *sp_draw_anchor_destroy(SPDrawAnchor *anchor);
-SPDrawAnchor *sp_draw_anchor_test(SPDrawAnchor *anchor, Geom::Point w, gboolean activate);
+SPDrawAnchor *sp_draw_anchor_test(SPDrawAnchor *anchor, Geom::Point w, bool activate);
#endif /* !SEEN_DRAW_ANCHOR_H */
diff --git a/src/interface.cpp b/src/ui/interface.cpp
index 1cbeb44a3..7830a8de1 100644
--- a/src/interface.cpp
+++ b/src/ui/interface.cpp
@@ -39,7 +39,7 @@
#include "shortcuts.h"
#include "document.h"
#include "desktop-handles.h"
-#include "interface.h"
+#include "ui/interface.h"
#include "desktop.h"
#include "selection.h"
#include "selection-chemistry.h"
@@ -57,7 +57,7 @@
#include "helper/gnome-utils.h"
#include "helper/window.h"
#include "io/sys.h"
-#include "dialogs/dialog-events.h"
+#include "ui/dialog-events.h"
#include "message-context.h"
#include "ui/uxmanager.h"
#include "ui/clipboard.h"
@@ -149,7 +149,7 @@ static void injectRenamedIcons();
static const int MIN_ONSCREEN_DISTANCE = 50;
void
-sp_create_window(SPViewWidget *vw, gboolean editable)
+sp_create_window(SPViewWidget *vw, bool editable)
{
g_return_if_fail(vw != NULL);
g_return_if_fail(SP_IS_VIEW_WIDGET(vw));
@@ -1756,6 +1756,13 @@ void ContextMenu::MakeItemMenu (void)
}
mi->show();
append(*mi);
+
+ /*SSet Clip Group */
+ mi = Gtk::manage(new Gtk::MenuItem(_("Create Clip G_roup"),1));
+ mi->signal_activate().connect(sigc::mem_fun(*this, &ContextMenu::CreateGroupClip));
+ mi->set_sensitive(TRUE);
+ mi->show();
+ append(*mi);
/* Set Clip */
mi = Gtk::manage(new Gtk::MenuItem(_("Set Cl_ip"), 1));
@@ -1867,6 +1874,10 @@ void ContextMenu::ReleaseMask(void)
sp_selection_unset_mask(_desktop, false);
}
+void ContextMenu::CreateGroupClip(void)
+{
+ sp_selection_set_clipgroup(_desktop);
+}
void ContextMenu::SetClip(void)
{
diff --git a/src/interface.h b/src/ui/interface.h
index 215a3bfc9..6fb74046f 100644
--- a/src/interface.h
+++ b/src/ui/interface.h
@@ -17,13 +17,9 @@
* Released under GNU GPL, read the file 'COPYING' for more information
*/
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
-
-#if GLIBMM_DISABLE_DEPRECATED && HAVE_GLIBMM_THREADS_H
-#include <glibmm/threads.h>
-#endif
+//#ifdef HAVE_CONFIG_H
+//# include <config.h>
+//#endif
#include <gtkmm/menu.h>
@@ -50,7 +46,7 @@ class View;
/**
* Create a new document window.
*/
-void sp_create_window (SPViewWidget *vw, gboolean editable);
+void sp_create_window (SPViewWidget *vw, bool editable);
/**
* \param widget unused
@@ -87,15 +83,15 @@ unsigned int sp_ui_close_all (void);
GtkWidget *sp_ui_main_menubar (Inkscape::UI::View::View *view);
void sp_menu_append_recent_documents (GtkWidget *menu);
-void sp_ui_dialog_title_string (Inkscape::Verb * verb, gchar* c);
+void sp_ui_dialog_title_string (Inkscape::Verb * verb, char* c);
Glib::ustring getLayoutPrefPath( Inkscape::UI::View::View *view );
/**
*
*/
-void sp_ui_error_dialog (const gchar * message);
-bool sp_ui_overwrite_file (const gchar * filename);
+void sp_ui_error_dialog (char const* message);
+bool sp_ui_overwrite_file (char const* filename);
/**
@@ -187,6 +183,7 @@ class ContextMenu : public Gtk::Menu
void SelectSameStrokeStyle(void);
void SelectSameObjectType(void);
void ItemCreateLink(void);
+ void CreateGroupClip(void);
void SetMask(void);
void ReleaseMask(void);
void SetClip(void);
diff --git a/src/object-edit.cpp b/src/ui/object-edit.cpp
index 12472140b..ca550502d 100644
--- a/src/object-edit.cpp
+++ b/src/ui/object-edit.cpp
@@ -34,7 +34,7 @@
#include "sp-pattern.h"
#include "sp-path.h"
#include <glibmm/i18n.h>
-#include "object-edit.h"
+#include "ui/object-edit.h"
#include "xml/repr.h"
#include <2geom/math-utils.h>
#include "knot-holder-entity.h"
@@ -56,6 +56,7 @@ static KnotHolder *sp_lpe_knot_holder(SPLPEItem *item, SPDesktop *desktop)
} // namespace
namespace Inkscape {
+namespace UI {
KnotHolder *createKnotHolder(SPItem *item, SPDesktop *desktop)
{
@@ -93,7 +94,8 @@ KnotHolder *createKnotHolder(SPItem *item, SPDesktop *desktop)
return knotholder;
}
-} // Inkscape
+}
+} // namespace Inkscape
/* SPRect */
@@ -101,33 +103,33 @@ KnotHolder *createKnotHolder(SPItem *item, SPDesktop *desktop)
class RectKnotHolderEntityRX : public KnotHolderEntity {
public:
virtual Geom::Point knot_get() const;
- virtual void knot_set(Geom::Point const &p, Geom::Point const &origin, guint state);
- virtual void knot_click(guint state);
+ virtual void knot_set(Geom::Point const &p, Geom::Point const &origin, unsigned int state);
+ virtual void knot_click(unsigned int state);
};
/* handle for vertical rounding radius */
class RectKnotHolderEntityRY : public KnotHolderEntity {
public:
virtual Geom::Point knot_get() const;
- virtual void knot_set(Geom::Point const &p, Geom::Point const &origin, guint state);
- virtual void knot_click(guint state);
+ virtual void knot_set(Geom::Point const &p, Geom::Point const &origin, unsigned int state);
+ virtual void knot_click(unsigned int state);
};
/* handle for width/height adjustment */
class RectKnotHolderEntityWH : public KnotHolderEntity {
public:
virtual Geom::Point knot_get() const;
- virtual void knot_set(Geom::Point const &p, Geom::Point const &origin, guint state);
+ virtual void knot_set(Geom::Point const &p, Geom::Point const &origin, unsigned int state);
protected:
- void set_internal(Geom::Point const &p, Geom::Point const &origin, guint state);
+ void set_internal(Geom::Point const &p, Geom::Point const &origin, unsigned int state);
};
/* handle for x/y adjustment */
class RectKnotHolderEntityXY : public KnotHolderEntity {
public:
virtual Geom::Point knot_get() const;
- virtual void knot_set(Geom::Point const &p, Geom::Point const &origin, guint state);
+ virtual void knot_set(Geom::Point const &p, Geom::Point const &origin, unsigned int state);
};
Geom::Point
@@ -140,7 +142,7 @@ RectKnotHolderEntityRX::knot_get() const
}
void
-RectKnotHolderEntityRX::knot_set(Geom::Point const &p, Geom::Point const &/*origin*/, guint state)
+RectKnotHolderEntityRX::knot_set(Geom::Point const &p, Geom::Point const &/*origin*/, unsigned int state)
{
SPRect *rect = dynamic_cast<SPRect *>(item);
g_assert(rect != NULL);
@@ -166,7 +168,7 @@ RectKnotHolderEntityRX::knot_set(Geom::Point const &p, Geom::Point const &/*orig
}
void
-RectKnotHolderEntityRX::knot_click(guint state)
+RectKnotHolderEntityRX::knot_click(unsigned int state)
{
SPRect *rect = dynamic_cast<SPRect *>(item);
g_assert(rect != NULL);
@@ -192,7 +194,7 @@ RectKnotHolderEntityRY::knot_get() const
}
void
-RectKnotHolderEntityRY::knot_set(Geom::Point const &p, Geom::Point const &/*origin*/, guint state)
+RectKnotHolderEntityRY::knot_set(Geom::Point const &p, Geom::Point const &/*origin*/, unsigned int state)
{
SPRect *rect = dynamic_cast<SPRect *>(item);
g_assert(rect != NULL);
@@ -227,7 +229,7 @@ RectKnotHolderEntityRY::knot_set(Geom::Point const &p, Geom::Point const &/*orig
}
void
-RectKnotHolderEntityRY::knot_click(guint state)
+RectKnotHolderEntityRY::knot_click(unsigned int state)
{
SPRect *rect = dynamic_cast<SPRect *>(item);
g_assert(rect != NULL);
@@ -267,7 +269,7 @@ RectKnotHolderEntityWH::knot_get() const
}
void
-RectKnotHolderEntityWH::set_internal(Geom::Point const &p, Geom::Point const &origin, guint state)
+RectKnotHolderEntityWH::set_internal(Geom::Point const &p, Geom::Point const &origin, unsigned int state)
{
SPRect *rect = dynamic_cast<SPRect *>(item);
g_assert(rect != NULL);
@@ -340,7 +342,7 @@ RectKnotHolderEntityWH::set_internal(Geom::Point const &p, Geom::Point const &or
}
void
-RectKnotHolderEntityWH::knot_set(Geom::Point const &p, Geom::Point const &origin, guint state)
+RectKnotHolderEntityWH::knot_set(Geom::Point const &p, Geom::Point const &origin, unsigned int state)
{
set_internal(p, origin, state);
update_knot();
@@ -356,7 +358,7 @@ RectKnotHolderEntityXY::knot_get() const
}
void
-RectKnotHolderEntityXY::knot_set(Geom::Point const &p, Geom::Point const &origin, guint state)
+RectKnotHolderEntityXY::knot_set(Geom::Point const &p, Geom::Point const &origin, unsigned int state)
{
SPRect *rect = dynamic_cast<SPRect *>(item);
g_assert(rect != NULL);
@@ -483,10 +485,10 @@ RectKnotHolder::RectKnotHolder(SPDesktop *desktop, SPItem *item, SPKnotHolderRel
class Box3DKnotHolderEntity : public KnotHolderEntity {
public:
virtual Geom::Point knot_get() const = 0;
- virtual void knot_set(Geom::Point const &p, Geom::Point const &origin, guint state) = 0;
+ virtual void knot_set(Geom::Point const &p, Geom::Point const &origin, unsigned int state) = 0;
Geom::Point knot_get_generic(SPItem *item, unsigned int knot_id) const;
- void knot_set_generic(SPItem *item, unsigned int knot_id, Geom::Point const &p, guint state);
+ void knot_set_generic(SPItem *item, unsigned int knot_id, Geom::Point const &p, unsigned int state);
};
Geom::Point
@@ -501,7 +503,7 @@ Box3DKnotHolderEntity::knot_get_generic(SPItem *item, unsigned int knot_id) cons
}
void
-Box3DKnotHolderEntity::knot_set_generic(SPItem *item, unsigned int knot_id, Geom::Point const &new_pos, guint state)
+Box3DKnotHolderEntity::knot_set_generic(SPItem *item, unsigned int knot_id, Geom::Point const &new_pos, unsigned int state)
{
Geom::Point const s = snap_knot_position(new_pos, state);
@@ -525,55 +527,55 @@ Box3DKnotHolderEntity::knot_set_generic(SPItem *item, unsigned int knot_id, Geom
class Box3DKnotHolderEntity0 : public Box3DKnotHolderEntity {
public:
virtual Geom::Point knot_get() const;
- virtual void knot_set(Geom::Point const &p, Geom::Point const &origin, guint state);
+ virtual void knot_set(Geom::Point const &p, Geom::Point const &origin, unsigned int state);
};
class Box3DKnotHolderEntity1 : public Box3DKnotHolderEntity {
public:
virtual Geom::Point knot_get() const;
- virtual void knot_set(Geom::Point const &p, Geom::Point const &origin, guint state);
+ virtual void knot_set(Geom::Point const &p, Geom::Point const &origin, unsigned int state);
};
class Box3DKnotHolderEntity2 : public Box3DKnotHolderEntity {
public:
virtual Geom::Point knot_get() const;
- virtual void knot_set(Geom::Point const &p, Geom::Point const &origin, guint state);
+ virtual void knot_set(Geom::Point const &p, Geom::Point const &origin, unsigned int state);
};
class Box3DKnotHolderEntity3 : public Box3DKnotHolderEntity {
public:
virtual Geom::Point knot_get() const;
- virtual void knot_set(Geom::Point const &p, Geom::Point const &origin, guint state);
+ virtual void knot_set(Geom::Point const &p, Geom::Point const &origin, unsigned int state);
};
class Box3DKnotHolderEntity4 : public Box3DKnotHolderEntity {
public:
virtual Geom::Point knot_get() const;
- virtual void knot_set(Geom::Point const &p, Geom::Point const &origin, guint state);
+ virtual void knot_set(Geom::Point const &p, Geom::Point const &origin, unsigned int state);
};
class Box3DKnotHolderEntity5 : public Box3DKnotHolderEntity {
public:
virtual Geom::Point knot_get() const;
- virtual void knot_set(Geom::Point const &p, Geom::Point const &origin, guint state);
+ virtual void knot_set(Geom::Point const &p, Geom::Point const &origin, unsigned int state);
};
class Box3DKnotHolderEntity6 : public Box3DKnotHolderEntity {
public:
virtual Geom::Point knot_get() const;
- virtual void knot_set(Geom::Point const &p, Geom::Point const &origin, guint state);
+ virtual void knot_set(Geom::Point const &p, Geom::Point const &origin, unsigned int state);
};
class Box3DKnotHolderEntity7 : public Box3DKnotHolderEntity {
public:
virtual Geom::Point knot_get() const;
- virtual void knot_set(Geom::Point const &p, Geom::Point const &origin, guint state);
+ virtual void knot_set(Geom::Point const &p, Geom::Point const &origin, unsigned int state);
};
class Box3DKnotHolderEntityCenter : public KnotHolderEntity {
public:
virtual Geom::Point knot_get() const;
- virtual void knot_set(Geom::Point const &p, Geom::Point const &origin, guint state);
+ virtual void knot_set(Geom::Point const &p, Geom::Point const &origin, unsigned int state);
};
Geom::Point
@@ -636,55 +638,55 @@ Box3DKnotHolderEntityCenter::knot_get() const
}
void
-Box3DKnotHolderEntity0::knot_set(Geom::Point const &new_pos, Geom::Point const &/*origin*/, guint state)
+Box3DKnotHolderEntity0::knot_set(Geom::Point const &new_pos, Geom::Point const &/*origin*/, unsigned int state)
{
knot_set_generic(item, 0, new_pos, state);
}
void
-Box3DKnotHolderEntity1::knot_set(Geom::Point const &new_pos, Geom::Point const &/*origin*/, guint state)
+Box3DKnotHolderEntity1::knot_set(Geom::Point const &new_pos, Geom::Point const &/*origin*/, unsigned int state)
{
knot_set_generic(item, 1, new_pos, state);
}
void
-Box3DKnotHolderEntity2::knot_set(Geom::Point const &new_pos, Geom::Point const &/*origin*/, guint state)
+Box3DKnotHolderEntity2::knot_set(Geom::Point const &new_pos, Geom::Point const &/*origin*/, unsigned int state)
{
knot_set_generic(item, 2, new_pos, state);
}
void
-Box3DKnotHolderEntity3::knot_set(Geom::Point const &new_pos, Geom::Point const &/*origin*/, guint state)
+Box3DKnotHolderEntity3::knot_set(Geom::Point const &new_pos, Geom::Point const &/*origin*/, unsigned int state)
{
knot_set_generic(item, 3, new_pos, state);
}
void
-Box3DKnotHolderEntity4::knot_set(Geom::Point const &new_pos, Geom::Point const &/*origin*/, guint state)
+Box3DKnotHolderEntity4::knot_set(Geom::Point const &new_pos, Geom::Point const &/*origin*/, unsigned int state)
{
knot_set_generic(item, 4, new_pos, state);
}
void
-Box3DKnotHolderEntity5::knot_set(Geom::Point const &new_pos, Geom::Point const &/*origin*/, guint state)
+Box3DKnotHolderEntity5::knot_set(Geom::Point const &new_pos, Geom::Point const &/*origin*/, unsigned int state)
{
knot_set_generic(item, 5, new_pos, state);
}
void
-Box3DKnotHolderEntity6::knot_set(Geom::Point const &new_pos, Geom::Point const &/*origin*/, guint state)
+Box3DKnotHolderEntity6::knot_set(Geom::Point const &new_pos, Geom::Point const &/*origin*/, unsigned int state)
{
knot_set_generic(item, 6, new_pos, state);
}
void
-Box3DKnotHolderEntity7::knot_set(Geom::Point const &new_pos, Geom::Point const &/*origin*/, guint state)
+Box3DKnotHolderEntity7::knot_set(Geom::Point const &new_pos, Geom::Point const &/*origin*/, unsigned int state)
{
knot_set_generic(item, 7, new_pos, state);
}
void
-Box3DKnotHolderEntityCenter::knot_set(Geom::Point const &new_pos, Geom::Point const &origin, guint state)
+Box3DKnotHolderEntityCenter::knot_set(Geom::Point const &new_pos, Geom::Point const &origin, unsigned int state)
{
Geom::Point const s = snap_knot_position(new_pos, state);
@@ -766,29 +768,29 @@ Box3DKnotHolder::Box3DKnotHolder(SPDesktop *desktop, SPItem *item, SPKnotHolderR
class ArcKnotHolderEntityStart : public KnotHolderEntity {
public:
virtual Geom::Point knot_get() const;
- virtual void knot_set(Geom::Point const &p, Geom::Point const &origin, guint state);
- virtual void knot_click(guint state);
+ virtual void knot_set(Geom::Point const &p, Geom::Point const &origin, unsigned int state);
+ virtual void knot_click(unsigned int state);
};
class ArcKnotHolderEntityEnd : public KnotHolderEntity {
public:
virtual Geom::Point knot_get() const;
- virtual void knot_set(Geom::Point const &p, Geom::Point const &origin, guint state);
- virtual void knot_click(guint state);
+ virtual void knot_set(Geom::Point const &p, Geom::Point const &origin, unsigned int state);
+ virtual void knot_click(unsigned int state);
};
class ArcKnotHolderEntityRX : public KnotHolderEntity {
public:
virtual Geom::Point knot_get() const;
- virtual void knot_set(Geom::Point const &p, Geom::Point const &origin, guint state);
- virtual void knot_click(guint state);
+ virtual void knot_set(Geom::Point const &p, Geom::Point const &origin, unsigned int state);
+ virtual void knot_click(unsigned int state);
};
class ArcKnotHolderEntityRY : public KnotHolderEntity {
public:
virtual Geom::Point knot_get() const;
- virtual void knot_set(Geom::Point const &p, Geom::Point const &origin, guint state);
- virtual void knot_click(guint state);
+ virtual void knot_set(Geom::Point const &p, Geom::Point const &origin, unsigned int state);
+ virtual void knot_click(unsigned int state);
};
/*
@@ -810,7 +812,7 @@ sp_genericellipse_side(SPGenericEllipse *ellipse, Geom::Point const &p)
}
void
-ArcKnotHolderEntityStart::knot_set(Geom::Point const &p, Geom::Point const &/*origin*/, guint state)
+ArcKnotHolderEntityStart::knot_set(Geom::Point const &p, Geom::Point const &/*origin*/, unsigned int state)
{
int snaps = Inkscape::Preferences::get()->getInt("/options/rotationsnapsperpi/value", 12);
@@ -842,7 +844,7 @@ ArcKnotHolderEntityStart::knot_get() const
}
void
-ArcKnotHolderEntityStart::knot_click(guint state)
+ArcKnotHolderEntityStart::knot_click(unsigned int state)
{
SPGenericEllipse *ge = dynamic_cast<SPGenericEllipse *>(item);
g_assert(ge != NULL);
@@ -854,7 +856,7 @@ ArcKnotHolderEntityStart::knot_click(guint state)
}
void
-ArcKnotHolderEntityEnd::knot_set(Geom::Point const &p, Geom::Point const &/*origin*/, guint state)
+ArcKnotHolderEntityEnd::knot_set(Geom::Point const &p, Geom::Point const &/*origin*/, unsigned int state)
{
int snaps = Inkscape::Preferences::get()->getInt("/options/rotationsnapsperpi/value", 12);
@@ -887,7 +889,7 @@ ArcKnotHolderEntityEnd::knot_get() const
void
-ArcKnotHolderEntityEnd::knot_click(guint state)
+ArcKnotHolderEntityEnd::knot_click(unsigned int state)
{
SPGenericEllipse *ge = dynamic_cast<SPGenericEllipse *>(item);
g_assert(ge != NULL);
@@ -900,7 +902,7 @@ ArcKnotHolderEntityEnd::knot_click(guint state)
void
-ArcKnotHolderEntityRX::knot_set(Geom::Point const &p, Geom::Point const &/*origin*/, guint state)
+ArcKnotHolderEntityRX::knot_set(Geom::Point const &p, Geom::Point const &/*origin*/, unsigned int state)
{
SPGenericEllipse *ge = dynamic_cast<SPGenericEllipse *>(item);
g_assert(ge != NULL);
@@ -926,7 +928,7 @@ ArcKnotHolderEntityRX::knot_get() const
}
void
-ArcKnotHolderEntityRX::knot_click(guint state)
+ArcKnotHolderEntityRX::knot_click(unsigned int state)
{
SPGenericEllipse *ge = dynamic_cast<SPGenericEllipse *>(item);
g_assert(ge != NULL);
@@ -938,7 +940,7 @@ ArcKnotHolderEntityRX::knot_click(guint state)
}
void
-ArcKnotHolderEntityRY::knot_set(Geom::Point const &p, Geom::Point const &/*origin*/, guint state)
+ArcKnotHolderEntityRY::knot_set(Geom::Point const &p, Geom::Point const &/*origin*/, unsigned int state)
{
SPGenericEllipse *ge = dynamic_cast<SPGenericEllipse *>(item);
g_assert(ge != NULL);
@@ -964,7 +966,7 @@ ArcKnotHolderEntityRY::knot_get() const
}
void
-ArcKnotHolderEntityRY::knot_click(guint state)
+ArcKnotHolderEntityRY::knot_click(unsigned int state)
{
SPGenericEllipse *ge = dynamic_cast<SPGenericEllipse *>(item);
g_assert(ge != NULL);
@@ -1014,19 +1016,19 @@ ArcKnotHolder::ArcKnotHolder(SPDesktop *desktop, SPItem *item, SPKnotHolderRelea
class StarKnotHolderEntity1 : public KnotHolderEntity {
public:
virtual Geom::Point knot_get() const;
- virtual void knot_set(Geom::Point const &p, Geom::Point const &origin, guint state);
- virtual void knot_click(guint state);
+ virtual void knot_set(Geom::Point const &p, Geom::Point const &origin, unsigned int state);
+ virtual void knot_click(unsigned int state);
};
class StarKnotHolderEntity2 : public KnotHolderEntity {
public:
virtual Geom::Point knot_get() const;
- virtual void knot_set(Geom::Point const &p, Geom::Point const &origin, guint state);
- virtual void knot_click(guint state);
+ virtual void knot_set(Geom::Point const &p, Geom::Point const &origin, unsigned int state);
+ virtual void knot_click(unsigned int state);
};
void
-StarKnotHolderEntity1::knot_set(Geom::Point const &p, Geom::Point const &/*origin*/, guint state)
+StarKnotHolderEntity1::knot_set(Geom::Point const &p, Geom::Point const &/*origin*/, unsigned int state)
{
SPStar *star = dynamic_cast<SPStar *>(item);
g_assert(star != NULL);
@@ -1053,7 +1055,7 @@ StarKnotHolderEntity1::knot_set(Geom::Point const &p, Geom::Point const &/*origi
}
void
-StarKnotHolderEntity2::knot_set(Geom::Point const &p, Geom::Point const &/*origin*/, guint state)
+StarKnotHolderEntity2::knot_set(Geom::Point const &p, Geom::Point const &/*origin*/, unsigned int state)
{
SPStar *star = dynamic_cast<SPStar *>(item);
g_assert(star != NULL);
@@ -1106,7 +1108,7 @@ StarKnotHolderEntity2::knot_get() const
}
static void
-sp_star_knot_click(SPItem *item, guint state)
+sp_star_knot_click(SPItem *item, unsigned int state)
{
SPStar *star = dynamic_cast<SPStar *>(item);
g_assert(star != NULL);
@@ -1124,13 +1126,13 @@ sp_star_knot_click(SPItem *item, guint state)
}
void
-StarKnotHolderEntity1::knot_click(guint state)
+StarKnotHolderEntity1::knot_click(unsigned int state)
{
sp_star_knot_click(item, state);
}
void
-StarKnotHolderEntity2::knot_click(guint state)
+StarKnotHolderEntity2::knot_click(unsigned int state)
{
sp_star_knot_click(item, state);
}
@@ -1164,14 +1166,14 @@ StarKnotHolder::StarKnotHolder(SPDesktop *desktop, SPItem *item, SPKnotHolderRel
class SpiralKnotHolderEntityInner : public KnotHolderEntity {
public:
virtual Geom::Point knot_get() const;
- virtual void knot_set(Geom::Point const &p, Geom::Point const &origin, guint state);
- virtual void knot_click(guint state);
+ virtual void knot_set(Geom::Point const &p, Geom::Point const &origin, unsigned int state);
+ virtual void knot_click(unsigned int state);
};
class SpiralKnotHolderEntityOuter : public KnotHolderEntity {
public:
virtual Geom::Point knot_get() const;
- virtual void knot_set(Geom::Point const &p, Geom::Point const &origin, guint state);
+ virtual void knot_set(Geom::Point const &p, Geom::Point const &origin, unsigned int state);
};
@@ -1182,7 +1184,7 @@ public:
* [control] constrain inner arg to round per PI/4
*/
void
-SpiralKnotHolderEntityInner::knot_set(Geom::Point const &p, Geom::Point const &origin, guint state)
+SpiralKnotHolderEntityInner::knot_set(Geom::Point const &p, Geom::Point const &origin, unsigned int state)
{
Inkscape::Preferences *prefs = Inkscape::Preferences::get();
int snaps = prefs->getInt("/options/rotationsnapsperpi/value", 12);
@@ -1232,7 +1234,7 @@ SpiralKnotHolderEntityInner::knot_set(Geom::Point const &p, Geom::Point const &o
* [control] constrain inner arg to round per PI/4
*/
void
-SpiralKnotHolderEntityOuter::knot_set(Geom::Point const &p, Geom::Point const &/*origin*/, guint state)
+SpiralKnotHolderEntityOuter::knot_set(Geom::Point const &p, Geom::Point const &/*origin*/, unsigned int state)
{
Inkscape::Preferences *prefs = Inkscape::Preferences::get();
int snaps = prefs->getInt("/options/rotationsnapsperpi/value", 12);
@@ -1325,7 +1327,7 @@ SpiralKnotHolderEntityOuter::knot_get() const
}
void
-SpiralKnotHolderEntityInner::knot_click(guint state)
+SpiralKnotHolderEntityInner::knot_click(unsigned int state)
{
SPSpiral *spiral = dynamic_cast<SPSpiral *>(item);
g_assert(spiral != NULL);
@@ -1364,11 +1366,11 @@ SpiralKnotHolder::SpiralKnotHolder(SPDesktop *desktop, SPItem *item, SPKnotHolde
class OffsetKnotHolderEntity : public KnotHolderEntity {
public:
virtual Geom::Point knot_get() const;
- virtual void knot_set(Geom::Point const &p, Geom::Point const &origin, guint state);
+ virtual void knot_set(Geom::Point const &p, Geom::Point const &origin, unsigned int state);
};
void
-OffsetKnotHolderEntity::knot_set(Geom::Point const &p, Geom::Point const &/*origin*/, guint /*state*/)
+OffsetKnotHolderEntity::knot_set(Geom::Point const &p, Geom::Point const &/*origin*/, unsigned int /*state*/)
{
SPOffset *offset = dynamic_cast<SPOffset *>(item);
g_assert(offset != NULL);
@@ -1409,7 +1411,7 @@ OffsetKnotHolder::OffsetKnotHolder(SPDesktop *desktop, SPItem *item, SPKnotHolde
class FlowtextKnotHolderEntity : public RectKnotHolderEntityWH {
public:
virtual Geom::Point knot_get() const;
- virtual void knot_set(Geom::Point const &p, Geom::Point const &origin, guint state);
+ virtual void knot_set(Geom::Point const &p, Geom::Point const &origin, unsigned int state);
};
Geom::Point
@@ -1422,7 +1424,7 @@ FlowtextKnotHolderEntity::knot_get() const
}
void
-FlowtextKnotHolderEntity::knot_set(Geom::Point const &p, Geom::Point const &origin, guint state)
+FlowtextKnotHolderEntity::knot_set(Geom::Point const &p, Geom::Point const &origin, unsigned int state)
{
set_internal(p, origin, state);
}
diff --git a/src/object-edit.h b/src/ui/object-edit.h
index ba59e46cd..75f3ce12b 100644
--- a/src/object-edit.h
+++ b/src/ui/object-edit.h
@@ -14,12 +14,13 @@
#include "knotholder.h"
-namespace Inkscape
-{
+namespace Inkscape {
+namespace UI {
KnotHolder *createKnotHolder(SPItem *item, SPDesktop *desktop);
}
+}
class RectKnotHolder : public KnotHolder {
public:
diff --git a/src/ui/shape-editor.cpp b/src/ui/shape-editor.cpp
new file mode 100644
index 000000000..0b9fc24c5
--- /dev/null
+++ b/src/ui/shape-editor.cpp
@@ -0,0 +1,177 @@
+/*
+ * Inkscape::ShapeEditor
+ *
+ * Authors:
+ * bulia byak <buliabyak@users.sf.net>
+ * Krzysztof Kosiński <tweenk.pl@gmail.com>
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <string.h>
+#include <glibmm/i18n.h>
+
+#include "desktop-handles.h"
+#include "document.h"
+#include "gc-anchored.h"
+#include "knotholder.h"
+#include "ui/object-edit.h"
+#include "sp-item.h"
+#include "sp-object.h"
+#include "ui/shape-editor.h"
+#include "xml/node-event-vector.h"
+
+//using Inkscape::createKnotHolder;
+
+namespace Inkscape {
+namespace UI {
+
+bool ShapeEditor::_blockSetItem = false;
+
+ShapeEditor::ShapeEditor(SPDesktop *dt) {
+ this->desktop = dt;
+ this->knotholder = NULL;
+ this->knotholder_listener_attached_for = NULL;
+}
+
+ShapeEditor::~ShapeEditor() {
+ unset_item();
+}
+
+void ShapeEditor::unset_item(bool keep_knotholder) {
+ if (this->knotholder) {
+ Inkscape::XML::Node *old_repr = this->knotholder->repr;
+ if (old_repr && old_repr == knotholder_listener_attached_for) {
+ sp_repr_remove_listener_by_data(old_repr, this);
+ Inkscape::GC::release(old_repr);
+ knotholder_listener_attached_for = NULL;
+ }
+
+ if (!keep_knotholder) {
+ delete this->knotholder;
+ this->knotholder = NULL;
+ }
+ }
+}
+
+bool ShapeEditor::has_knotholder() {
+ return this->knotholder != NULL;
+}
+
+void ShapeEditor::update_knotholder() {
+ if (this->knotholder)
+ this->knotholder->update_knots();
+}
+
+bool ShapeEditor::has_local_change() {
+ return (this->knotholder && this->knotholder->local_change != 0);
+}
+
+void ShapeEditor::decrement_local_change() {
+ if (this->knotholder) {
+ this->knotholder->local_change = FALSE;
+ }
+}
+
+const SPItem *ShapeEditor::get_item() {
+ const SPItem *item = NULL;
+ if (this->has_knotholder()) {
+ item = this->knotholder->getItem();
+ }
+ return item;
+}
+
+void ShapeEditor::event_attr_changed(Inkscape::XML::Node *, gchar const *name, gchar const *, gchar const *, bool, void *data)
+{
+ g_assert(data);
+ ShapeEditor *sh = static_cast<ShapeEditor *>(data);
+ bool changed_kh = false;
+
+ if (sh->has_knotholder())
+ {
+ changed_kh = !sh->has_local_change();
+ sh->decrement_local_change();
+ if (changed_kh) {
+ // this can happen if an LPEItem's knotholder handle was dragged, in which case we want
+ // to keep the knotholder; in all other cases (e.g., if the LPE itself changes) we delete it
+ sh->reset_item(!strcmp(name, "d"));
+ }
+ }
+}
+
+static Inkscape::XML::NodeEventVector shapeeditor_repr_events = {
+ NULL, /* child_added */
+ NULL, /* child_removed */
+ ShapeEditor::event_attr_changed,
+ NULL, /* content_changed */
+ NULL /* order_changed */
+};
+
+
+void ShapeEditor::set_item(SPItem *item, bool keep_knotholder) {
+ if (_blockSetItem) {
+ return;
+ }
+
+ // this happens (and should only happen) when for an LPEItem having both knotholder and
+ // nodepath the knotholder is adapted; in this case we don't want to delete the knotholder
+ // since this freezes the handles
+ unset_item(keep_knotholder);
+
+ if (item) {
+ Inkscape::XML::Node *repr;
+ if (!this->knotholder) {
+ // only recreate knotholder if none is present
+ this->knotholder = createKnotHolder(item, desktop);
+ }
+ if (this->knotholder) {
+ this->knotholder->update_knots();
+ // setting new listener
+ repr = this->knotholder->repr;
+ if (repr != knotholder_listener_attached_for) {
+ Inkscape::GC::anchor(repr);
+ sp_repr_add_listener(repr, &shapeeditor_repr_events, this);
+ knotholder_listener_attached_for = repr;
+ }
+ }
+ }
+}
+
+
+/** FIXME: This thing is only called when the item needs to be updated in response to repr change.
+ Why not make a reload function in KnotHolder? */
+void ShapeEditor::reset_item(bool keep_knotholder)
+{
+ if (knotholder) {
+ SPObject *obj = sp_desktop_document(desktop)->getObjectByRepr(knotholder_listener_attached_for); /// note that it is not certain that this is an SPItem; it could be a LivePathEffectObject.
+ set_item(SP_ITEM(obj), keep_knotholder);
+ }
+}
+
+/**
+ * Returns true if this ShapeEditor has a knot above which the mouse currently hovers.
+ */
+bool ShapeEditor::knot_mouseover() const {
+ if (this->knotholder) {
+ return knotholder->knot_mouseover();
+ }
+
+ return false;
+}
+
+} // namespace UI
+} // namespace Inkscape
+
+/*
+ Local Variables:
+ mode:c++
+ c-file-style:"stroustrup"
+ c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
+ indent-tabs-mode:nil
+ fill-column:99
+ End:
+*/
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4 :
diff --git a/src/ui/shape-editor.h b/src/ui/shape-editor.h
new file mode 100644
index 000000000..142a2493b
--- /dev/null
+++ b/src/ui/shape-editor.h
@@ -0,0 +1,71 @@
+#ifndef SEEN_SHAPE_EDITOR_H
+#define SEEN_SHAPE_EDITOR_H
+
+/*
+ * Inkscape::ShapeEditor
+ *
+ * This is a container class which contains a knotholder for shapes.
+ * It is attached to a single item.
+ *
+ * Authors:
+ * bulia byak <buliabyak@users.sf.net>
+ *
+ */
+
+class KnotHolder;
+class LivePathEffectObject;
+class SPDesktop;
+class SPItem;
+
+namespace Inkscape { namespace XML { class Node; }
+namespace UI {
+
+class ShapeEditor {
+public:
+
+ ShapeEditor(SPDesktop *desktop);
+ ~ShapeEditor();
+
+ void set_item(SPItem *item, bool keep_knotholder = false);
+ void unset_item(bool keep_knotholder = false);
+
+ void update_knotholder(); //((deprecated))
+
+ bool has_local_change();
+ void decrement_local_change();
+
+ bool knot_mouseover() const;
+
+ static void blockSetItem(bool b) { _blockSetItem = b; } // kludge
+
+ static void event_attr_changed(Inkscape::XML::Node * /*repr*/, char const *name, char const * /*old_value*/,
+ char const * /*new_value*/, bool /*is_interactive*/, void *data);
+private:
+ bool has_knotholder();
+ void reset_item (bool keep_knotholder = true);
+ const SPItem *get_item();
+
+ static bool _blockSetItem;
+
+ SPDesktop *desktop;
+ KnotHolder *knotholder;
+ Inkscape::XML::Node *knotholder_listener_attached_for;
+};
+
+} // namespace UI
+} // namespace Inkscape
+
+#endif // SEEN_SHAPE_EDITOR_H
+
+
+/*
+ Local Variables:
+ mode:c++
+ c-file-style:"stroustrup"
+ c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
+ indent-tabs-mode:nil
+ fill-column:99
+ End:
+*/
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4 :
+
diff --git a/src/tool-factory.h b/src/ui/tool-factory.h
index 726706732..726706732 100644
--- a/src/tool-factory.h
+++ b/src/ui/tool-factory.h
diff --git a/src/ui/tool/control-point-selection.cpp b/src/ui/tool/control-point-selection.cpp
index d10ed0f0d..998f74ee0 100644
--- a/src/ui/tool/control-point-selection.cpp
+++ b/src/ui/tool/control-point-selection.cpp
@@ -74,7 +74,7 @@ ControlPointSelection::~ControlPointSelection()
}
/** Add a control point to the selection. */
-std::pair<ControlPointSelection::iterator, bool> ControlPointSelection::insert(const value_type &x)
+std::pair<ControlPointSelection::iterator, bool> ControlPointSelection::insert(const value_type &x, bool notify)
{
iterator found = _points.find(x);
if (found != _points.end()) {
@@ -86,6 +86,10 @@ std::pair<ControlPointSelection::iterator, bool> ControlPointSelection::insert(c
x->updateState();
_pointChanged(x, true);
+ if (notify) {
+ signal_selection_changed.emit(std::vector<key_type>(1, x), true);
+ }
+
return std::pair<iterator, bool>(found, true);
}
@@ -97,47 +101,75 @@ void ControlPointSelection::erase(iterator pos)
erased->updateState();
_pointChanged(erased, false);
}
-ControlPointSelection::size_type ControlPointSelection::erase(const key_type &k)
+ControlPointSelection::size_type ControlPointSelection::erase(const key_type &k, bool notify)
{
iterator pos = _points.find(k);
if (pos == _points.end()) return 0;
erase(pos);
+
+ if (notify) {
+ signal_selection_changed.emit(std::vector<key_type>(1, k), false);
+ }
return 1;
}
void ControlPointSelection::erase(iterator first, iterator last)
{
+ std::vector<SelectableControlPoint *> out(first, last);
while (first != last) erase(first++);
+ signal_selection_changed.emit(out, false);
}
/** Remove all points from the selection, making it empty. */
void ControlPointSelection::clear()
{
+ std::vector<SelectableControlPoint *> out(begin(), end());
for (iterator i = begin(); i != end(); )
erase(i++);
+ if (!out.empty())
+ signal_selection_changed.emit(out, false);
}
/** Select all points that this selection can contain. */
void ControlPointSelection::selectAll()
{
for (set_type::iterator i = _all_points.begin(); i != _all_points.end(); ++i) {
- insert(*i);
+ insert(*i, false);
}
+ std::vector<SelectableControlPoint *> out(_all_points.begin(), _all_points.end());
+ if (!out.empty())
+ signal_selection_changed.emit(out, true);
}
/** Select all points inside the given rectangle (in desktop coordinates). */
void ControlPointSelection::selectArea(Geom::Rect const &r)
{
+ std::vector<SelectableControlPoint *> out;
for (set_type::iterator i = _all_points.begin(); i != _all_points.end(); ++i) {
- if (r.contains(**i))
- insert(*i);
+ if (r.contains(**i)) {
+ insert(*i, false);
+ out.push_back(*i);
+ }
}
+ if (!out.empty())
+ signal_selection_changed.emit(out, true);
}
/** Unselect all selected points and select all unselected points. */
void ControlPointSelection::invertSelection()
{
+ std::vector<SelectableControlPoint *> in, out;
for (set_type::iterator i = _all_points.begin(); i != _all_points.end(); ++i) {
- if ((*i)->selected()) erase(*i);
- else insert(*i);
+ if ((*i)->selected()) {
+ in.push_back(*i);
+ erase(*i);
+ }
+ else {
+ out.push_back(*i);
+ insert(*i, false);
+ }
}
+ if (!in.empty())
+ signal_selection_changed.emit(in, false);
+ if (!out.empty())
+ signal_selection_changed.emit(out, true);
}
void ControlPointSelection::spatialGrow(SelectableControlPoint *origin, int dir)
{
@@ -166,6 +198,7 @@ void ControlPointSelection::spatialGrow(SelectableControlPoint *origin, int dir)
if (match) {
if (grow) insert(match);
else erase(match);
+ signal_selection_changed.emit(std::vector<value_type>(1, match), grow);
}
}
@@ -389,7 +422,7 @@ void ControlPointSelection::_pointChanged(SelectableControlPoint *p, bool select
_handles->rotationCenter().move(_bounds->midpoint());
}
- signal_point_changed.emit(p, selected);
+ //signal_point_changed.emit(p, selected);
}
void ControlPointSelection::_mouseoverChanged()
diff --git a/src/ui/tool/control-point-selection.h b/src/ui/tool/control-point-selection.h
index a087e0455..2d812c0a3 100644
--- a/src/ui/tool/control-point-selection.h
+++ b/src/ui/tool/control-point-selection.h
@@ -62,18 +62,19 @@ public:
const_iterator end() const { return _points.end(); }
// insert
- std::pair<iterator, bool> insert(const value_type& x);
+ std::pair<iterator, bool> insert(const value_type& x, bool notify = true);
template <class InputIterator>
void insert(InputIterator first, InputIterator last) {
for (; first != last; ++first) {
- insert(*first);
+ insert(*first, false);
}
+ signal_selection_changed.emit(std::vector<key_type>(first, last), true);
}
// erase
void clear();
void erase(iterator pos);
- size_type erase(const key_type& k);
+ size_type erase(const key_type& k, bool notify = true);
void erase(iterator first, iterator last);
// find
@@ -108,7 +109,9 @@ public:
void toggleTransformHandlesMode();
sigc::signal<void> signal_update;
- sigc::signal<void, SelectableControlPoint *, bool> signal_point_changed;
+ // It turns out that emitting a signal after every point is selected or deselected is not too efficient,
+ // so this can be done in a massive group once the selection is finally changed.
+ sigc::signal<void, std::vector<SelectableControlPoint *>, bool> signal_selection_changed;
sigc::signal<void, CommitEvent> signal_commit;
void getOriginalPoints(std::vector<Inkscape::SnapCandidatePoint> &pts);
@@ -166,4 +169,4 @@ private:
fill-column:99
End:
*/
-// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8 :
diff --git a/src/ui/tool/curve-drag-point.cpp b/src/ui/tool/curve-drag-point.cpp
index 4ca736f80..013553410 100644
--- a/src/ui/tool/curve-drag-point.cpp
+++ b/src/ui/tool/curve-drag-point.cpp
@@ -53,9 +53,11 @@ bool CurveDragPoint::grabbed(GdkEventMotion */*event*/)
// delta is a vector equal 1/3 of distance from first to second
Geom::Point delta = (second->position() - first->position()) / 3.0;
- first->front()->move(first->front()->position() + delta);
- second->back()->move(second->back()->position() - delta);
-
+ // only update the nodes if the mode is bspline
+ if(!_pm.isBSpline(false)){
+ first->front()->move(first->front()->position() + delta);
+ second->back()->move(second->back()->position() - delta);
+ }
_pm.update();
} else {
_segment_was_degenerate = false;
@@ -88,9 +90,12 @@ void CurveDragPoint::dragged(Geom::Point &new_pos, GdkEventMotion *event)
Geom::Point offset0 = ((1-weight)/(3*t*(1-t)*(1-t))) * delta;
Geom::Point offset1 = (weight/(3*t*t*(1-t))) * delta;
- first->front()->move(first->front()->position() + offset0);
- second->back()->move(second->back()->position() + offset1);
-
+ //modified so that, if the trace is bspline, it only acts if the SHIFT key is pressed
+ if(!_pm.isBSpline(false)){
+ first->front()->move(first->front()->position() + offset0);
+ second->back()->move(second->back()->position() + offset1);
+ }else if(weight>=0.8 && held_shift(*event))second->back()->move(new_pos);
+ else if(weight<=0.2 && held_shift(*event))first->front()->move(new_pos);
_pm.update();
}
diff --git a/src/ui/tool/multi-path-manipulator.cpp b/src/ui/tool/multi-path-manipulator.cpp
index 65987ad52..d7b35c974 100644
--- a/src/ui/tool/multi-path-manipulator.cpp
+++ b/src/ui/tool/multi-path-manipulator.cpp
@@ -122,7 +122,7 @@ MultiPathManipulator::MultiPathManipulator(PathSharedData &data, sigc::connectio
{
_selection.signal_commit.connect(
sigc::mem_fun(*this, &MultiPathManipulator::_commit));
- _selection.signal_point_changed.connect(
+ _selection.signal_selection_changed.connect(
sigc::hide( sigc::hide(
signal_coords_changed.make_slot())));
}
@@ -182,7 +182,7 @@ void MultiPathManipulator::setItems(std::set<ShapeRecord> const &s)
ShapeRecord const &r = *i;
if (!SP_IS_PATH(r.item) && !IS_LIVEPATHEFFECT(r.item)) continue;
boost::shared_ptr<PathManipulator> newpm(new PathManipulator(*this, (SPPath*) r.item,
- r.edit_transform, _getOutlineColor(r.role), r.lpe_key));
+ r.edit_transform, _getOutlineColor(r.role, r.item), r.lpe_key));
newpm->showHandles(_show_handles);
// always show outlines for clips and masks
newpm->showOutline(_show_outline || r.role != SHAPE_ROLE_NORMAL);
@@ -670,7 +670,18 @@ bool MultiPathManipulator::event(Inkscape::UI::Tools::ToolBase *event_context, G
// a) del preserves shape, and control is not pressed
// b) ctrl+del preserves shape (del_preserves_shape is false), and control is pressed
// Hence xor
- deleteNodes(del_preserves_shape ^ held_control(event->key));
+ guint mode = prefs->getInt("/tools/freehand/pen/freehand-mode", 0);
+
+ //if the trace is bspline ( mode 2)
+ if(mode==2){
+ // is this correct ?
+ if(del_preserves_shape ^ held_control(event->key))
+ deleteNodes(false);
+ else
+ deleteNodes(true);
+ }
+ else
+ deleteNodes(del_preserves_shape ^ held_control(event->key));
// Delete any selected gradient nodes as well
event_context->deleteSelectedDrag(held_control(event->key));
@@ -833,7 +844,7 @@ void MultiPathManipulator::_doneWithCleanup(gchar const *reason, bool alert_LPE)
}
/** Get an outline color based on the shape's role (normal, mask, LPE parameter, etc.). */
-guint32 MultiPathManipulator::_getOutlineColor(ShapeRole role)
+guint32 MultiPathManipulator::_getOutlineColor(ShapeRole role, SPItem *item)
{
Inkscape::Preferences *prefs = Inkscape::Preferences::get();
switch(role) {
@@ -845,7 +856,7 @@ guint32 MultiPathManipulator::_getOutlineColor(ShapeRole role)
return prefs->getColor("/tools/nodes/lpe_param_color", 0x009000ff);
case SHAPE_ROLE_NORMAL:
default:
- return prefs->getColor("/tools/nodes/outline_color", 0xff0000ff);
+ return item->highlight_color();
}
}
diff --git a/src/ui/tool/multi-path-manipulator.h b/src/ui/tool/multi-path-manipulator.h
index 1328372c6..cdbf34e9d 100644
--- a/src/ui/tool/multi-path-manipulator.h
+++ b/src/ui/tool/multi-path-manipulator.h
@@ -53,6 +53,7 @@ public:
void insertNodesAtExtrema(ExtremumType extremum);
void insertNodes();
+ void alertLPE();
void duplicateNodes();
void joinNodes();
void breakNodes();
@@ -104,9 +105,9 @@ private:
}
void _commit(CommitEvent cps);
- void _done(gchar const *reason, bool alert_LPE = false);
+ void _done(gchar const *reason, bool alert_LPE = true);
void _doneWithCleanup(gchar const *reason, bool alert_LPE = false);
- guint32 _getOutlineColor(ShapeRole role);
+ guint32 _getOutlineColor(ShapeRole role, SPItem *item);
MapType _mmap;
public:
diff --git a/src/ui/tool/node.cpp b/src/ui/tool/node.cpp
index fbbc4be64..4abc901d2 100644
--- a/src/ui/tool/node.cpp
+++ b/src/ui/tool/node.cpp
@@ -13,7 +13,6 @@
#include <glib/gi18n.h>
#include <2geom/bezier-utils.h>
#include <2geom/transforms.h>
-
#include "display/sp-ctrlline.h"
#include "display/sp-canvas.h"
#include "display/sp-canvas-util.h"
@@ -28,7 +27,10 @@
#include "ui/tool/event-utils.h"
#include "ui/tool/node.h"
#include "ui/tool/path-manipulator.h"
+#include "ui/tools/node-tool.h"
+#include "ui/tools-switch.h"
#include <gdk/gdkkeysyms.h>
+#include <cmath>
namespace {
@@ -58,6 +60,11 @@ Inkscape::ControlType nodeTypeToCtrlType(Inkscape::UI::NodeType type)
namespace Inkscape {
namespace UI {
+const double handleCubicGap = 0.01;
+const double noPower = 0.0;
+const double defaultStartPower = 0.3334;
+const double defaultEndPower = 0.6667;
+
ControlPoint::ColorSet Node::node_colors = {
{0xbfbfbf00, 0x000000ff}, // normal fill, stroke
{0xff000000, 0x000000ff}, // mouseover fill, stroke
@@ -166,6 +173,12 @@ void Handle::move(Geom::Point const &new_pos)
}
}
setPosition(new_pos);
+
+ //move the handler and its oposite the same proportion
+ if(_pm().isBSpline()){
+ setPosition(_pm().BSplineHandleReposition(this,this));
+ this->other()->setPosition(_pm().BSplineHandleReposition(this->other(),this));
+ }
return;
}
@@ -177,6 +190,13 @@ void Handle::move(Geom::Point const &new_pos)
Geom::Point new_delta = (Geom::dot(delta, direction)
/ Geom::L2sq(direction)) * direction;
setRelativePos(new_delta);
+
+ //move the handler and its oposite the same proportion
+ if(_pm().isBSpline()){
+ setPosition(_pm().BSplineHandleReposition(this,this));
+ this->other()->setPosition(_pm().BSplineHandleReposition(this->other(),this));
+ }
+
return;
}
@@ -195,8 +215,14 @@ void Handle::move(Geom::Point const &new_pos)
break;
default: break;
}
-
setPosition(new_pos);
+
+ // moves the handler and its oposite the same proportion
+ if(_pm().isBSpline()){
+ setPosition(_pm().BSplineHandleReposition(this,this));
+ this->other()->setPosition(_pm().BSplineHandleReposition(this->other(),this));
+ }
+
}
void Handle::setPosition(Geom::Point const &p)
@@ -273,12 +299,27 @@ bool Handle::_eventHandler(Inkscape::UI::Tools::ToolBase *event_context, GdkEven
break;
default: break;
}
+ break;
+ // new double click event to set the handlers of a node to the default proportion, defaultStartPower%
+ case GDK_2BUTTON_PRESS:
+ handle_2button_press();
+ break;
+
default: break;
}
return ControlPoint::_eventHandler(event_context, event);
}
+//this function moves the handler and its oposite to the default proportion of defaultStartPower
+void Handle::handle_2button_press(){
+ if(_pm().isBSpline()){
+ setPosition(_pm().BSplineHandleReposition(this,defaultStartPower));
+ this->other()->setPosition(_pm().BSplineHandleReposition(this->other(),defaultStartPower));
+ _pm().update();
+ }
+}
+
bool Handle::grabbed(GdkEventMotion *)
{
_saved_other_pos = other()->position();
@@ -289,6 +330,10 @@ bool Handle::grabbed(GdkEventMotion *)
void Handle::dragged(Geom::Point &new_pos, GdkEventMotion *event)
{
+ if (tools_isactive(_desktop, TOOLS_NODES)) {
+ Inkscape::UI::Tools::NodeTool *nt = static_cast<Inkscape::UI::Tools::NodeTool*>(_desktop->event_context);
+ nt->update_helperpath();
+ }
Geom::Point parent_pos = _parent->position();
Geom::Point origin = _last_drag_origin();
SnapManager &sm = _desktop->namedview->snap_manager;
@@ -326,10 +371,18 @@ void Handle::dragged(Geom::Point &new_pos, GdkEventMotion *event)
ctrl_constraint = Inkscape::Snapper::SnapConstraint(parent_pos, parent_pos - perp_pos);
}
new_pos = result;
+ // moves the handler and its oposite in X fixed positions depending on parameter "steps with control"
+ // by default in live BSpline
+ if(_pm().isBSpline()){
+ setPosition(new_pos);
+ int steps = _pm().BSplineGetSteps();
+ new_pos=_pm().BSplineHandleReposition(this,ceilf(_pm().BSplineHandlePosition(this,this)*steps)/steps);
+ }
}
std::vector<Inkscape::SnapCandidatePoint> unselected;
- if (snap) {
+ //if the snap adjustment is activated and it is not bspline
+ if (snap && !_pm().isBSpline(false)) {
ControlPointSelection::Set &nodes = _parent->_selection.allPoints();
for (ControlPointSelection::Set::iterator i = nodes.begin(); i != nodes.end(); ++i) {
Node *n = static_cast<Node*>(*i);
@@ -369,6 +422,10 @@ void Handle::dragged(Geom::Point &new_pos, GdkEventMotion *event)
other()->setPosition(_saved_other_pos);
}
}
+ //if it is bspline but SHIFT or CONTROL are not pressed it fixes it in the original position
+ if(_pm().isBSpline() && !held_shift(*event) && !held_control(*event)){
+ new_pos=_last_drag_origin();
+ }
move(new_pos); // needed for correct update, even though it's redundant
_pm().update();
}
@@ -427,13 +484,19 @@ static double snap_increment_degrees() {
Glib::ustring Handle::_getTip(unsigned state) const
{
char const *more;
+ // a trick to mark as bspline if the node has no strength, we are going to use it later
+ // to show the appropiate messages. We cannot do it in any different way becasue the function is constant
+
+ bool isBSpline = _pm().isBSpline();
bool can_shift_rotate = _parent->type() == NODE_CUSP && !other()->isDegenerate();
- if (can_shift_rotate) {
+ if (can_shift_rotate && !isBSpline) {
more = C_("Path handle tip", "more: Shift, Ctrl, Alt");
- } else {
+ } else if(isBSpline){
+ more = C_("Path handle tip", "more: Ctrl");
+ }else {
more = C_("Path handle tip", "more: Ctrl, Alt");
}
- if (state_held_alt(state)) {
+ if (state_held_alt(state) && !isBSpline) {
if (state_held_control(state)) {
if (state_held_shift(state) && can_shift_rotate) {
return format_tip(C_("Path handle tip",
@@ -456,18 +519,24 @@ Glib::ustring Handle::_getTip(unsigned state) const
}
} else {
if (state_held_control(state)) {
- if (state_held_shift(state) && can_shift_rotate) {
+ if (state_held_shift(state) && can_shift_rotate && !isBSpline) {
return format_tip(C_("Path handle tip",
"<b>Shift+Ctrl</b>: snap rotation angle to %g° increments and rotate both handles"),
snap_increment_degrees());
- } else {
+ } else if(isBSpline){
+ return format_tip(C_("Path handle tip",
+ "<b>Ctrl</b>: Move handle by his actual steps in BSpline Live Effect"));
+ }else{
return format_tip(C_("Path handle tip",
"<b>Ctrl</b>: snap rotation angle to %g° increments, click to retract"),
snap_increment_degrees());
}
- } else if (state_held_shift(state) && can_shift_rotate) {
+ } else if (state_held_shift(state) && can_shift_rotate && !isBSpline) {
return C_("Path hande tip",
"<b>Shift</b>: rotate both handles by the same angle");
+ } else if(state_held_shift(state) && isBSpline){
+ return C_("Path hande tip",
+ "<b>Shift</b>: move handle");
}
}
@@ -476,9 +545,13 @@ Glib::ustring Handle::_getTip(unsigned state) const
return format_tip(C_("Path handle tip",
"<b>Auto node handle</b>: drag to convert to smooth node (%s)"), more);
default:
- return format_tip(C_("Path handle tip",
- "<b>%s</b>: drag to shape the segment (%s)"),
- handle_type_to_localized_string(_parent->type()), more);
+ if(!isBSpline){
+ return format_tip(C_("Path handle tip",
+ "<b>Auto node handle</b>: drag to convert to smooth node (%s)"), more);
+ }else{
+ return format_tip(C_("Path handle tip",
+ "<b>BSpline node handle</b>: Shift to drag, double click to reset (%s)"), more);
+ }
}
}
@@ -553,18 +626,80 @@ void Node::move(Geom::Point const &new_pos)
// move handles when the node moves.
Geom::Point old_pos = position();
Geom::Point delta = new_pos - position();
+
+ // save the previous nodes strength to apply it again once the node is moved
+ double nodeWeight = noPower;
+ double nextNodeWeight = noPower;
+ double prevNodeWeight = noPower;
+ Node *n = this;
+ Node * nextNode = n->nodeToward(n->front());
+ Node * prevNode = n->nodeToward(n->back());
+ nodeWeight = fmax(_pm().BSplineHandlePosition(n->front()),_pm().BSplineHandlePosition(n->back()));
+ if(prevNode){
+ if(prevNode->isEndNode()){
+ prevNodeWeight = _pm().BSplineHandlePosition(prevNode->front(),prevNode->front());
+ }
+ }
+ if(nextNode){
+ if(nextNode->isEndNode()){
+ nextNodeWeight = _pm().BSplineHandlePosition(nextNode->back(),nextNode->back());
+ }
+ }
+
setPosition(new_pos);
+
_front.setPosition(_front.position() + delta);
_back.setPosition(_back.position() + delta);
// if the node has a smooth handle after a line segment, it should be kept colinear
// with the segment
_fixNeighbors(old_pos, new_pos);
+
+ // move the affected handlers. First the node ones, later the adjoining ones.
+ if(_pm().isBSpline()){
+ _front.setPosition(_pm().BSplineHandleReposition(this->front(),nodeWeight));
+ _back.setPosition(_pm().BSplineHandleReposition(this->back(),nodeWeight));
+ if(prevNode){
+ if(prevNode->isEndNode()){
+ prevNode->front()->setPosition(_pm().BSplineHandleReposition(prevNode->front(),prevNodeWeight));
+ }else{
+ prevNode->front()->setPosition(_pm().BSplineHandleReposition(prevNode->front(),prevNode->back()));
+ }
+ }
+ if(nextNode){
+ if(nextNode->isEndNode()){
+ nextNode->back()->setPosition(_pm().BSplineHandleReposition(nextNode->back(),nextNodeWeight));
+ }else{
+ nextNode->back()->setPosition(_pm().BSplineHandleReposition(nextNode->back(),nextNode->front()));
+ }
+ }
+ }
}
void Node::transform(Geom::Affine const &m)
{
+
Geom::Point old_pos = position();
+
+ // save the previous nodes strength to apply it again once the node is moved
+ double nodeWeight = noPower;
+ double nextNodeWeight = noPower;
+ double prevNodeWeight = noPower;
+ Node *n = this;
+ Node * nextNode = n->nodeToward(n->front());
+ Node * prevNode = n->nodeToward(n->back());
+ nodeWeight = _pm().BSplineHandlePosition(n->front());
+ if(prevNode){
+ if(prevNode->isEndNode()){
+ prevNodeWeight = _pm().BSplineHandlePosition(prevNode->front(),prevNode->front());
+ }
+ }
+ if(nextNode){
+ if(nextNode->isEndNode()){
+ nextNodeWeight = _pm().BSplineHandlePosition(nextNode->back(),nextNode->back());
+ }
+ }
+
setPosition(position() * m);
_front.setPosition(_front.position() * m);
_back.setPosition(_back.position() * m);
@@ -572,6 +707,26 @@ void Node::transform(Geom::Affine const &m)
/* Affine transforms keep handle invariants for smooth and symmetric nodes,
* but smooth nodes at ends of linear segments and auto nodes need special treatment */
_fixNeighbors(old_pos, position());
+
+ // move the involved handlers, first the node ones, later the adjoining ones
+ if(_pm().isBSpline()){
+ _front.setPosition(_pm().BSplineHandleReposition(this->front(),nodeWeight));
+ _back.setPosition(_pm().BSplineHandleReposition(this->back(),nodeWeight));
+ if(prevNode){
+ if(prevNode->isEndNode()){
+ prevNode->front()->setPosition(_pm().BSplineHandleReposition(prevNode->front(),prevNodeWeight));
+ }else{
+ prevNode->front()->setPosition(_pm().BSplineHandleReposition(prevNode->front(),prevNode->back()));
+ }
+ }
+ if(nextNode){
+ if(nextNode->isEndNode()){
+ nextNode->back()->setPosition(_pm().BSplineHandleReposition(nextNode->back(),nextNodeWeight));
+ }else{
+ nextNode->back()->setPosition(_pm().BSplineHandleReposition(nextNode->back(),nextNode->front()));
+ }
+ }
+ }
}
Geom::Rect Node::bounds() const
@@ -657,6 +812,7 @@ void Node::showHandles(bool v)
if (!_back.isDegenerate()) {
_back.setVisible(v);
}
+
}
void Node::updateHandles()
@@ -758,6 +914,16 @@ void Node::setType(NodeType type, bool update_handles)
break;
default: break;
}
+ /* in node type changes, about bspline traces, we can mantain them with noPower power in border mode,
+ or we give them the default power in curve mode */
+ if(_pm().isBSpline()){
+ double weight = noPower;
+ if(_pm().BSplineHandlePosition(this->front()) != noPower ){
+ weight = defaultStartPower;
+ }
+ _front.setPosition(_pm().BSplineHandleReposition(this->front(),weight));
+ _back.setPosition(_pm().BSplineHandleReposition(this->back(),weight));
+ }
}
_type = type;
_setControlType(nodeTypeToCtrlType(_type));
@@ -870,6 +1036,7 @@ bool Node::_eventHandler(Inkscape::UI::Tools::ToolBase *event_context, GdkEvent
_selection.spatialGrow(this, dir);
}
return true;
+
default:
break;
}
@@ -1004,6 +1171,11 @@ void Node::_setState(State state)
case STATE_CLICKED:
mgr.setActive(_canvas_item, true);
mgr.setPrelight(_canvas_item, false);
+ //this shows the handlers when selecting the nodes
+ if(_pm().isBSpline()){
+ this->front()->setPosition(_pm().BSplineHandleReposition(this->front()));
+ this->back()->setPosition(_pm().BSplineHandleReposition(this->back()));
+ }
break;
}
SelectableControlPoint::_setState(state);
@@ -1055,6 +1227,10 @@ bool Node::grabbed(GdkEventMotion *event)
void Node::dragged(Geom::Point &new_pos, GdkEventMotion *event)
{
+ if (tools_isactive(_desktop, TOOLS_NODES)) {
+ Inkscape::UI::Tools::NodeTool *nt = static_cast<Inkscape::UI::Tools::NodeTool*>(_desktop->event_context);
+ nt->update_helperpath();
+ }
// For a note on how snapping is implemented in Inkscape, see snap.h.
SnapManager &sm = _desktop->namedview->snap_manager;
// even if we won't really snap, we might still call the one of the
@@ -1258,6 +1434,7 @@ Node *Node::nodeAwayFrom(Handle *h)
Glib::ustring Node::_getTip(unsigned state) const
{
+ bool isBSpline = _pm().isBSpline();
if (state_held_shift(state)) {
bool can_drag_out = (_next() && _front.isDegenerate()) || (_prev() && _back.isDegenerate());
if (can_drag_out) {
@@ -1287,15 +1464,24 @@ Glib::ustring Node::_getTip(unsigned state) const
// No modifiers: assemble tip from node type
char const *nodetype = node_type_to_localized_string(_type);
if (_selection.transformHandlesEnabled() && selected()) {
- if (_selection.size() == 1) {
+ if (_selection.size() == 1 && !isBSpline) {
return format_tip(C_("Path node tip",
"<b>%s</b>: drag to shape the path (more: Shift, Ctrl, Alt)"), nodetype);
+ }else if(_selection.size() == 1){
+ return format_tip(C_("Path node tip",
+ "<b>BSpline node</b>: %g weight, drag to shape the path (more: Shift, Ctrl, Alt)"),noPower/*this->bsplineWeight*/);
}
return format_tip(C_("Path node tip",
"<b>%s</b>: drag to shape the path, click to toggle scale/rotation handles (more: Shift, Ctrl, Alt)"), nodetype);
}
- return format_tip(C_("Path node tip",
- "<b>%s</b>: drag to shape the path, click to select only this node (more: Shift, Ctrl, Alt)"), nodetype);
+ if (!isBSpline) {
+ return format_tip(C_("Path node tip",
+ "<b>%s</b>: drag to shape the path, click to select only this node (more: Shift, Ctrl, Alt)"), nodetype);
+ }else{
+ return format_tip(C_("Path node tip",
+ "<b>BSpline node</b>: drag to shape the path, click to select only this node (more: Shift, Ctrl, Alt)"));
+
+ }
}
Glib::ustring Node::_getDragTip(GdkEventMotion */*event*/) const
@@ -1452,7 +1638,37 @@ void NodeList::reverse()
void NodeList::clear()
{
- for (iterator i = begin(); i != end();) erase (i++);
+ // ugly but more efficient clearing mechanism
+ std::vector<ControlPointSelection *> to_clear;
+ std::vector<std::pair<SelectableControlPoint *, long> > nodes;
+ long in = -1;
+ for (iterator i = begin(); i != end(); ++i) {
+ SelectableControlPoint *rm = static_cast<Node*>(i._node);
+ if (std::find(to_clear.begin(), to_clear.end(), &rm->_selection) == to_clear.end()) {
+ to_clear.push_back(&rm->_selection);
+ ++in;
+ }
+ nodes.push_back(std::make_pair(rm, in));
+ }
+ for (size_t i = 0, e = nodes.size(); i != e; ++i) {
+ to_clear[nodes[i].second]->erase(nodes[i].first, false);
+ }
+ std::vector<std::vector<SelectableControlPoint *> > emission;
+ for (long i = 0, e = to_clear.size(); i != e; ++i) {
+ emission.push_back(std::vector<SelectableControlPoint *>());
+ for (size_t j = 0, f = nodes.size(); j != f; ++j) {
+ if (nodes[j].second != i)
+ break;
+ emission[i].push_back(nodes[j].first);
+ }
+ }
+
+ for (size_t i = 0, e = emission.size(); i != e; ++i) {
+ to_clear[i]->signal_selection_changed.emit(emission[i], false);
+ }
+
+ for (iterator i = begin(); i != end();)
+ erase (i++);
}
NodeList::iterator NodeList::erase(iterator i)
diff --git a/src/ui/tool/node.h b/src/ui/tool/node.h
index b2f338e2c..101af4817 100644
--- a/src/ui/tool/node.h
+++ b/src/ui/tool/node.h
@@ -41,6 +41,17 @@ template <typename> class NodeIterator;
}
}
+/*
+#if HAVE_TR1_UNORDERED_SET
+namespace std {
+namespace tr1 {
+template <typename N> struct hash< Inkscape::UI::NodeIterator<N> >;
+}
+}
+#endif
+#endif
+*/
+
namespace Inkscape {
namespace UI {
@@ -109,7 +120,7 @@ public:
protected:
Handle(NodeSharedData const &data, Geom::Point const &initial_pos, Node *parent);
-
+ virtual void handle_2button_press();
virtual bool _eventHandler(Inkscape::UI::Tools::ToolBase *event_context, GdkEvent *event);
virtual void dragged(Geom::Point &new_pos, GdkEventMotion *event);
virtual bool grabbed(GdkEventMotion *event);
@@ -123,6 +134,7 @@ protected:
private:
inline PathManipulator &_pm();
+ inline PathManipulator &_pm() const;
Node *_parent; // the handle's lifetime does not extend beyond that of the parent node,
// so a naked pointer is OK and allows setting it during Node's construction
SPCtrlLine *_handle_line;
@@ -209,6 +221,7 @@ public:
Node *nodeAwayFrom(Handle *h);
NodeList &nodeList() { return *(static_cast<ListNode*>(this)->ln_list); }
+ NodeList &nodeList() const { return *(static_cast<ListNode const*>(this)->ln_list); }
/**
* Move the node to the bottom of its canvas group.
@@ -255,6 +268,7 @@ private:
Inkscape::SnapSourceType _snapSourceType() const;
Inkscape::SnapTargetType _snapTargetType() const;
inline PathManipulator &_pm();
+ inline PathManipulator &_pm() const;
/** Determine whether two nodes are joined by a linear segment. */
static bool _is_line_segment(Node *first, Node *second);
@@ -482,10 +496,17 @@ inline double Handle::length() const {
inline PathManipulator &Handle::_pm() {
return _parent->_pm();
}
+inline PathManipulator &Handle::_pm() const {
+ return _parent->_pm();
+}
inline PathManipulator &Node::_pm() {
return nodeList().subpathList().pm();
}
+inline PathManipulator &Node::_pm() const {
+ return nodeList().subpathList().pm();
+}
+
// definitions for node iterator
template <typename N>
NodeIterator<N>::operator bool() const {
diff --git a/src/ui/tool/path-manipulator.cpp b/src/ui/tool/path-manipulator.cpp
index 338499672..52ff5d42c 100644
--- a/src/ui/tool/path-manipulator.cpp
+++ b/src/ui/tool/path-manipulator.cpp
@@ -11,6 +11,7 @@
*/
#include "live_effects/lpe-powerstroke.h"
+#include "live_effects/lpe-fillet-chamfer.h"
#include <string>
#include <sstream>
#include <deque>
@@ -42,6 +43,7 @@
#include "ui/tool/multi-path-manipulator.h"
#include "xml/node.h"
#include "xml/node-observer.h"
+#include "live_effects/lpe-bspline.h"
namespace Inkscape {
namespace UI {
@@ -54,6 +56,10 @@ enum PathChange {
};
} // anonymous namespace
+const double handleCubicGap = 0.01;
+const double noPower = 0.0;
+const double defaultStartPower = 0.3334;
+const double defaultEndPower = 0.6667;
/**
* Notifies the path manipulator when something changes the path being edited
@@ -102,7 +108,6 @@ private:
};
void build_segment(Geom::PathBuilder &, Node *, Node *);
-
PathManipulator::PathManipulator(MultiPathManipulator &mpm, SPPath *path,
Geom::Affine const &et, guint32 outline_color, Glib::ustring lpe_key)
: PointManipulator(mpm._path_data.node_data.desktop, *mpm._path_data.node_data.selection)
@@ -139,12 +144,14 @@ PathManipulator::PathManipulator(MultiPathManipulator &mpm, SPPath *path,
_selection.signal_update.connect(
sigc::bind(sigc::mem_fun(*this, &PathManipulator::update), false));
- _selection.signal_point_changed.connect(
- sigc::mem_fun(*this, &PathManipulator::_selectionChanged));
+ _selection.signal_selection_changed.connect(
+ sigc::mem_fun(*this, &PathManipulator::_selectionChangedM));
_desktop->signal_zoom_changed.connect(
sigc::hide( sigc::mem_fun(*this, &PathManipulator::_updateOutlineOnZoomChange)));
_createControlPointsFromGeometry();
+ //Define if the path is BSpline on construction
+ isBSpline(true);
}
PathManipulator::~PathManipulator()
@@ -662,6 +669,15 @@ unsigned PathManipulator::_deleteStretch(NodeList::iterator start, NodeList::ite
nl.erase(start);
start = next;
}
+ // if we are removing, we readjust the handlers
+ if(isBSpline()){
+ if(start.prev()){
+ start.prev()->front()->setPosition(BSplineHandleReposition(start.prev()->front(),start.prev()->back()));
+ }
+ if(end){
+ end->back()->setPosition(BSplineHandleReposition(end->back(),end->front()));
+ }
+ }
return del_len;
}
@@ -816,7 +832,6 @@ void PathManipulator::scaleHandle(Node *n, int which, int dir, bool pixel)
}
h->setRelativePos(relpos);
update();
-
gchar const *key = which < 0 ? "handle:scale:left" : "handle:scale:right";
_commit(_("Scale handle"), key);
}
@@ -980,9 +995,37 @@ NodeList::iterator PathManipulator::subdivideSegment(NodeList::iterator first, d
// set new handle positions
Node *n = new Node(_multi_path_manipulator._path_data.node_data, seg2[0]);
- n->back()->setPosition(seg1[2]);
- n->front()->setPosition(seg2[1]);
- n->setType(NODE_SMOOTH, false);
+ if(!isBSpline()){
+ n->back()->setPosition(seg1[2]);
+ n->front()->setPosition(seg2[1]);
+ n->setType(NODE_SMOOTH, false);
+ } else {
+ const double handleCubicGap = 0.01;
+ Geom::D2< Geom::SBasis > SBasisInsideNodes;
+ SPCurve *lineInsideNodes = new SPCurve();
+ if(second->back()->isDegenerate()){
+ lineInsideNodes->moveto(n->position());
+ lineInsideNodes->lineto(second->position());
+ SBasisInsideNodes = lineInsideNodes->first_segment()->toSBasis();
+ Geom::Point next = SBasisInsideNodes.valueAt(defaultStartPower);
+ next = Geom::Point(next[Geom::X] + handleCubicGap,next[Geom::Y] + handleCubicGap);
+ lineInsideNodes->reset();
+ n->front()->setPosition(next);
+ }else{
+ n->front()->setPosition(seg2[1]);
+ }
+ if(first->front()->isDegenerate()){
+ lineInsideNodes->moveto(n->position());
+ lineInsideNodes->lineto(first->position());
+ SBasisInsideNodes = lineInsideNodes->first_segment()->toSBasis();
+ Geom::Point previous = SBasisInsideNodes.valueAt(defaultStartPower);
+ previous = Geom::Point(previous[Geom::X] + handleCubicGap,previous[Geom::Y] + handleCubicGap);
+ n->back()->setPosition(previous);
+ }else{
+ n->back()->setPosition(seg1[2]);
+ }
+ n->setType(NODE_CUSP, false);
+ }
inserted = list.insert(insert_at, n);
first->front()->move(seg1[1]);
@@ -1104,7 +1147,6 @@ void PathManipulator::_createControlPointsFromGeometry()
Geom::Curve const &cseg = pit->back_closed();
bool fuse_ends = pit->closed()
&& Geom::are_near(cseg.initialPoint(), cseg.finalPoint());
-
for (Geom::Path::const_iterator cit = pit->begin(); cit != pit->end_open(); ++cit) {
Geom::Point pos = cit->finalPoint();
Node *current_node;
@@ -1171,6 +1213,93 @@ void PathManipulator::_createControlPointsFromGeometry()
}
}
+//determines if the trace has a bspline effect and the number of steps that it takes
+int PathManipulator::BSplineGetSteps() const {
+
+ LivePathEffect::LPEBSpline const *lpe_bsp = NULL;
+
+ if (SP_IS_LPE_ITEM(_path) && _path->hasPathEffect()){
+ Inkscape::LivePathEffect::Effect const *thisEffect = SP_LPE_ITEM(_path)->getPathEffectOfType(Inkscape::LivePathEffect::BSPLINE);
+ if(thisEffect){
+ lpe_bsp = dynamic_cast<LivePathEffect::LPEBSpline const*>(thisEffect->getLPEObj()->get_lpe());
+ }
+ }
+ int steps = 0;
+ if(lpe_bsp){
+ steps = lpe_bsp->steps+1;
+ }
+ return steps;
+}
+
+// determines if the trace has bspline effect
+bool PathManipulator::isBSpline(bool recalculate){
+ if(recalculate){
+ _is_bspline = this->BSplineGetSteps() > 0;
+ }
+ return _is_bspline;
+}
+
+bool PathManipulator::isBSpline() const {
+ return BSplineGetSteps() > 0;
+}
+
+// returns the corresponding strength to the position of the handlers
+double PathManipulator::BSplineHandlePosition(Handle *h, Handle *h2){
+ using Geom::X;
+ using Geom::Y;
+ if(h2){
+ h = h2;
+ }
+ double pos = noPower;
+ const double handleCubicGap = 0.01;
+ Node *n = h->parent();
+ Node * nextNode = NULL;
+ nextNode = n->nodeToward(h);
+ if(nextNode){
+ SPCurve *lineInsideNodes = new SPCurve();
+ lineInsideNodes->moveto(n->position());
+ lineInsideNodes->lineto(nextNode->position());
+ if(!are_near(h->position(), n->position())){
+ pos = Geom::nearest_point(Geom::Point(h->position()[X] - handleCubicGap, h->position()[Y] - handleCubicGap), *lineInsideNodes->first_segment());
+ }
+ }
+ if (pos == noPower && !h2){
+ return BSplineHandlePosition(h, h->other());
+ }
+ return pos;
+}
+
+// give the location for the handler in the corresponding position
+Geom::Point PathManipulator::BSplineHandleReposition(Handle *h, Handle *h2){
+ double pos = this->BSplineHandlePosition(h, h2);
+ return BSplineHandleReposition(h,pos);
+}
+
+// give the location for the handler to the specified position
+Geom::Point PathManipulator::BSplineHandleReposition(Handle *h,double pos){
+ using Geom::X;
+ using Geom::Y;
+ const double handleCubicGap = 0.01;
+ Geom::Point ret = h->position();
+ Node *n = h->parent();
+ Geom::D2< Geom::SBasis > SBasisInsideNodes;
+ SPCurve *lineInsideNodes = new SPCurve();
+ Node * nextNode = NULL;
+ nextNode = n->nodeToward(h);
+ if(nextNode && pos != noPower){
+ lineInsideNodes->moveto(n->position());
+ lineInsideNodes->lineto(nextNode->position());
+ SBasisInsideNodes = lineInsideNodes->first_segment()->toSBasis();
+ ret = SBasisInsideNodes.valueAt(pos);
+ ret = Geom::Point(ret[X] + handleCubicGap,ret[Y] + handleCubicGap);
+ }else{
+ if(pos == noPower){
+ ret = n->position();
+ }
+ }
+ return ret;
+}
+
/** Construct the geometric representation of nodes and handles, update the outline
* and display
* \param alert_LPE if true, first the LPE is warned what the new path is going to be before updating it
@@ -1178,6 +1307,8 @@ void PathManipulator::_createControlPointsFromGeometry()
void PathManipulator::_createGeometryFromControlPoints(bool alert_LPE)
{
Geom::PathBuilder builder;
+ //Refresh if is bspline some times -think on path change selection, this value get lost
+ isBSpline(true);
for (std::list<SubpathPtr>::iterator spi = _subpaths.begin(); spi != _subpaths.end(); ) {
SubpathPtr subpath = *spi;
if (subpath->empty()) {
@@ -1186,7 +1317,6 @@ void PathManipulator::_createGeometryFromControlPoints(bool alert_LPE)
}
NodeList::iterator prev = subpath->begin();
builder.moveTo(prev->position());
-
for (NodeList::iterator i = ++subpath->begin(); i != subpath->end(); ++i) {
build_segment(builder, prev.ptr(), i.ptr());
prev = i;
@@ -1207,11 +1337,20 @@ void PathManipulator::_createGeometryFromControlPoints(bool alert_LPE)
_spcurve->set_pathvector(pathv);
if (alert_LPE) {
/// \todo note that _path can be an Inkscape::LivePathEffect::Effect* too, kind of confusing, rework member naming?
- if (SP_IS_LPE_ITEM(_path) && _path->hasPathEffect()) {
- PathEffectList effect_list = _path->getEffectList();
- LivePathEffect::LPEPowerStroke *lpe_pwr = dynamic_cast<LivePathEffect::LPEPowerStroke*>( effect_list.front()->lpeobject->get_lpe() );
- if (lpe_pwr) {
- lpe_pwr->adjustForNewPath(pathv);
+ if (SP_IS_LPE_ITEM(_path) && _path->hasPathEffect()){
+ Inkscape::LivePathEffect::Effect* thisEffect = SP_LPE_ITEM(_path)->getPathEffectOfType(Inkscape::LivePathEffect::POWERSTROKE);
+ if(thisEffect){
+ LivePathEffect::LPEPowerStroke *lpe_pwr = dynamic_cast<LivePathEffect::LPEPowerStroke*>(thisEffect->getLPEObj()->get_lpe());
+ if (lpe_pwr) {
+ lpe_pwr->adjustForNewPath(pathv);
+ }
+ }
+ thisEffect = SP_LPE_ITEM(_path)->getPathEffectOfType(Inkscape::LivePathEffect::FILLET_CHAMFER);
+ if(thisEffect){
+ LivePathEffect::LPEFilletChamfer *lpe_fll = dynamic_cast<LivePathEffect::LPEFilletChamfer*>(thisEffect->getLPEObj()->get_lpe());
+ if (lpe_fll) {
+ lpe_fll->adjustForNewPath(pathv);
+ }
}
}
}
@@ -1419,6 +1558,12 @@ bool PathManipulator::_handleClicked(Handle *h, GdkEventButton *event)
return false;
}
+void PathManipulator::_selectionChangedM(std::vector<SelectableControlPoint *> pvec, bool selected) {
+ for (size_t n = 0, e = pvec.size(); n < e; ++n) {
+ _selectionChanged(pvec[n], selected);
+ }
+}
+
void PathManipulator::_selectionChanged(SelectableControlPoint *p, bool selected)
{
if (selected) ++_num_selected;
diff --git a/src/ui/tool/path-manipulator.h b/src/ui/tool/path-manipulator.h
index 7a13ce723..4d2bf4300 100644
--- a/src/ui/tool/path-manipulator.h
+++ b/src/ui/tool/path-manipulator.h
@@ -19,6 +19,7 @@
#include <boost/weak_ptr.hpp>
#include "ui/tool/node.h"
#include "ui/tool/manipulator.h"
+#include "live_effects/lpe-bspline.h"
struct SPCanvasItem;
class SPCurve;
@@ -95,6 +96,7 @@ public:
NodeList::iterator extremeNode(NodeList::iterator origin, bool search_selected,
bool search_unselected, bool closest);
+ int BSplineGetSteps() const;
// this is necessary for Tab-selection in MultiPathManipulator
SubpathList &subpathList() { return _subpaths; }
@@ -104,6 +106,12 @@ private:
typedef boost::shared_ptr<NodeList> SubpathPtr;
void _createControlPointsFromGeometry();
+
+ bool isBSpline(bool recalculate = false);
+ bool isBSpline() const;
+ double BSplineHandlePosition(Handle *h, Handle *h2 = NULL);
+ Geom::Point BSplineHandleReposition(Handle *h, Handle *h2 = NULL);
+ Geom::Point BSplineHandleReposition(Handle *h, double pos);
void _createGeometryFromControlPoints(bool alert_LPE = false);
unsigned _deleteStretch(NodeList::iterator first, NodeList::iterator last, bool keep_shape);
std::string _createTypeString();
@@ -114,7 +122,8 @@ private:
Glib::ustring _nodetypesKey();
Inkscape::XML::Node *_getXMLNode();
- void _selectionChanged(SelectableControlPoint *p, bool selected);
+ void _selectionChangedM(std::vector<SelectableControlPoint *> pvec, bool selected);
+ void _selectionChanged(SelectableControlPoint * p, bool selected);
bool _nodeClicked(Node *, GdkEventButton *);
void _handleGrabbed();
bool _handleClicked(Handle *, GdkEventButton *);
@@ -145,6 +154,7 @@ private:
bool _show_path_direction;
bool _live_outline;
bool _live_objects;
+ bool _is_bspline;
Glib::ustring _lpe_key;
friend class PathManipulatorObserver;
diff --git a/src/ui/tool/selectable-control-point.h b/src/ui/tool/selectable-control-point.h
index 8acfc1168..362d4addc 100644
--- a/src/ui/tool/selectable-control-point.h
+++ b/src/ui/tool/selectable-control-point.h
@@ -28,6 +28,7 @@ public:
virtual Geom::Rect bounds() const {
return Geom::Rect(position(), position());
}
+ friend class NodeList;
protected:
diff --git a/src/tools-switch.cpp b/src/ui/tools-switch.cpp
index 9b36177ba..47b9d2832 100644
--- a/src/tools-switch.cpp
+++ b/src/ui/tools-switch.cpp
@@ -11,10 +11,7 @@
* Released under GNU GPL, read the file 'COPYING' for more information
*/
-
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif
+#include <gtkmm.h> // prevents deprecation warnings
#include <cstring>
#include <string>
@@ -26,40 +23,42 @@
#include <xml/repr.h>
-#include "ui/tools/select-tool.h"
-#include "ui/tools/node-tool.h"
-#include "ui/tools/tweak-tool.h"
-#include "ui/tools/spray-tool.h"
-#include "sp-path.h"
-#include "ui/tools/rect-tool.h"
-#include "sp-rect.h"
-#include "ui/tools/box3d-tool.h"
+#include "ui/tools-switch.h"
+
#include "box3d.h"
-#include "ui/tools/arc-tool.h"
#include "sp-ellipse.h"
-#include "ui/tools/tweak-tool.h"
+#include "sp-flowtext.h"
+#include "sp-offset.h"
+#include "sp-path.h"
+#include "sp-rect.h"
#include "sp-star.h"
-#include "ui/tools/spiral-tool.h"
#include "sp-spiral.h"
+#include "sp-text.h"
+
+// TODO: How many of these are actually needed?
+#include "ui/tools/arc-tool.h"
+#include "ui/tools/box3d-tool.h"
#include "ui/tools/calligraphic-tool.h"
+#include "ui/tools/connector-tool.h"
+#include "ui/tools/dropper-tool.h"
#include "ui/tools/eraser-tool.h"
+#include "ui/tools/flood-tool.h"
+#include "ui/tools/gradient-tool.h"
+#include "ui/tools/lpe-tool.h"
+#include "ui/tools/measure-tool.h"
+#include "ui/tools/mesh-tool.h"
+#include "ui/tools/node-tool.h"
#include "ui/tools/pen-tool.h"
#include "ui/tools/pencil-tool.h"
-#include "ui/tools/lpe-tool.h"
+#include "ui/tools/rect-tool.h"
+#include "ui/tools/select-tool.h"
+#include "ui/tools/spiral-tool.h"
+#include "ui/tools/spray-tool.h"
#include "ui/tools/text-tool.h"
-#include "sp-text.h"
-#include "sp-flowtext.h"
-#include "ui/tools/gradient-tool.h"
-#include "ui/tools/mesh-tool.h"
+#include "ui/tools/tweak-tool.h"
#include "ui/tools/zoom-tool.h"
-#include "ui/tools/measure-tool.h"
-#include "ui/tools/dropper-tool.h"
-#include "ui/tools/connector-tool.h"
-#include "ui/tools/flood-tool.h"
-#include "sp-offset.h"
-#include "message-context.h"
-#include "tools-switch.h"
+#include "message-context.h"
using Inkscape::UI::Tools::ToolBase;
@@ -89,6 +88,8 @@ static char const *const tool_names[] = {
"/tools/lpetool",
NULL
};
+
+// TODO: HEY! these belong to the tools themselves!
static char const *const tool_msg[] = {
NULL,
N_("<b>Click</b> to Select and Transform objects, <b>Drag</b> to select many objects."),
diff --git a/src/tools-switch.h b/src/ui/tools-switch.h
index 280837e87..280837e87 100644
--- a/src/tools-switch.h
+++ b/src/ui/tools-switch.h
diff --git a/src/ui/tools/arc-tool.cpp b/src/ui/tools/arc-tool.cpp
index 43f8eb9e1..4f64ade25 100644
--- a/src/ui/tools/arc-tool.cpp
+++ b/src/ui/tools/arc-tool.cpp
@@ -40,7 +40,7 @@
#include "desktop-style.h"
#include "context-fns.h"
#include "verbs.h"
-#include "shape-editor.h"
+#include "ui/shape-editor.h"
#include "ui/tools/tool-base.h"
#include "ui/tools/arc-tool.h"
@@ -48,7 +48,7 @@
using Inkscape::DocumentUndo;
-#include "tool-factory.h"
+#include "ui/tool-factory.h"
namespace Inkscape {
namespace UI {
@@ -102,8 +102,8 @@ ArcTool::~ArcTool() {
* destroys old and creates new knotholder.
*/
void ArcTool::selection_changed(Inkscape::Selection* selection) {
- this->shape_editor->unset_item(SH_KNOTHOLDER);
- this->shape_editor->set_item(selection->singleItem(), SH_KNOTHOLDER);
+ this->shape_editor->unset_item();
+ this->shape_editor->set_item(selection->singleItem());
}
void ArcTool::setup() {
@@ -115,7 +115,7 @@ void ArcTool::setup() {
SPItem *item = sp_desktop_selection(this->desktop)->singleItem();
if (item) {
- this->shape_editor->set_item(item, SH_KNOTHOLDER);
+ this->shape_editor->set_item(item);
}
this->sel_changed_connection.disconnect();
diff --git a/src/ui/tools/arc-tool.h b/src/ui/tools/arc-tool.h
index c4c67660d..55cbaf78c 100644
--- a/src/ui/tools/arc-tool.h
+++ b/src/ui/tools/arc-tool.h
@@ -30,7 +30,7 @@ namespace Inkscape {
}
#define SP_ARC_CONTEXT(obj) (dynamic_cast<Inkscape::UI::Tools::ArcTool*>((Inkscape::UI::Tools::ToolBase*)obj))
-#define SP_IS_ARC_CONTEXT(obj) (dynamic_cast<const Inkscape::UI::Tools::ArcTool*>(const Inkscape::UI::Tools::ToolBase*(obj)) != NULL)
+#define SP_IS_ARC_CONTEXT(obj) (dynamic_cast<const Inkscape::UI::Tools::ArcTool*>(obj) != NULL)
namespace Inkscape {
namespace UI {
diff --git a/src/ui/tools/box3d-tool.cpp b/src/ui/tools/box3d-tool.cpp
index e00894d55..0a20a0842 100644
--- a/src/ui/tools/box3d-tool.cpp
+++ b/src/ui/tools/box3d-tool.cpp
@@ -47,12 +47,12 @@
#include "box3d-side.h"
#include "document-private.h"
#include "line-geometry.h"
-#include "shape-editor.h"
+#include "ui/shape-editor.h"
#include "verbs.h"
using Inkscape::DocumentUndo;
-#include "tool-factory.h"
+#include "ui/tool-factory.h"
namespace Inkscape {
namespace UI {
@@ -112,8 +112,8 @@ Box3dTool::~Box3dTool() {
* destroys old and creates new knotholder.
*/
void Box3dTool::selection_changed(Inkscape::Selection* selection) {
- this->shape_editor->unset_item(SH_KNOTHOLDER);
- this->shape_editor->set_item(selection->singleItem(), SH_KNOTHOLDER);
+ this->shape_editor->unset_item();
+ this->shape_editor->set_item(selection->singleItem());
if (selection->perspList().size() == 1) {
// selecting a single box changes the current perspective
@@ -147,7 +147,7 @@ void Box3dTool::setup() {
SPItem *item = sp_desktop_selection(this->desktop)->singleItem();
if (item) {
- this->shape_editor->set_item(item, SH_KNOTHOLDER);
+ this->shape_editor->set_item(item);
}
this->sel_changed_connection.disconnect();
diff --git a/src/ui/tools/calligraphic-tool.cpp b/src/ui/tools/calligraphic-tool.cpp
index 64097e834..d297fe5e1 100644
--- a/src/ui/tools/calligraphic-tool.cpp
+++ b/src/ui/tools/calligraphic-tool.cpp
@@ -82,7 +82,7 @@ using Inkscape::DocumentUndo;
#define DYNA_MIN_WIDTH 1.0e-6
-#include "tool-factory.h"
+#include "ui/tool-factory.h"
namespace Inkscape {
namespace UI {
diff --git a/src/ui/tools/connector-tool.cpp b/src/ui/tools/connector-tool.cpp
index d1355e807..7b5c84c16 100644
--- a/src/ui/tools/connector-tool.cpp
+++ b/src/ui/tools/connector-tool.cpp
@@ -109,7 +109,7 @@
using Inkscape::DocumentUndo;
-#include "tool-factory.h"
+#include "ui/tool-factory.h"
namespace Inkscape {
namespace UI {
diff --git a/src/ui/tools/dropper-tool.cpp b/src/ui/tools/dropper-tool.cpp
index 99d42a211..6c55f7484 100644
--- a/src/ui/tools/dropper-tool.cpp
+++ b/src/ui/tools/dropper-tool.cpp
@@ -52,7 +52,7 @@ using Inkscape::DocumentUndo;
static GdkCursor *cursor_dropper_fill = NULL;
static GdkCursor *cursor_dropper_stroke = NULL;
-#include "tool-factory.h"
+#include "ui/tool-factory.h"
namespace Inkscape {
namespace UI {
diff --git a/src/ui/tools/eraser-tool.cpp b/src/ui/tools/eraser-tool.cpp
index 4106785e7..bf4015b4c 100644
--- a/src/ui/tools/eraser-tool.cpp
+++ b/src/ui/tools/eraser-tool.cpp
@@ -84,7 +84,7 @@ using Inkscape::DocumentUndo;
#define DRAG_DEFAULT 1.0
#define DRAG_MAX 1.0
-#include "tool-factory.h"
+#include "ui/tool-factory.h"
namespace Inkscape {
namespace UI {
diff --git a/src/ui/tools/flood-tool.cpp b/src/ui/tools/flood-tool.cpp
index d74848dc6..5745fc9cc 100644
--- a/src/ui/tools/flood-tool.cpp
+++ b/src/ui/tools/flood-tool.cpp
@@ -50,7 +50,7 @@
#include "preferences.h"
#include "rubberband.h"
#include "selection.h"
-#include "shape-editor.h"
+#include "ui/shape-editor.h"
#include "sp-defs.h"
#include "sp-item.h"
#include "splivarot.h"
@@ -74,7 +74,7 @@ using Inkscape::Display::ExtractARGB32;
using Inkscape::Display::ExtractRGB32;
using Inkscape::Display::AssembleARGB32;
-#include "tool-factory.h"
+#include "ui/tool-factory.h"
namespace Inkscape {
namespace UI {
@@ -119,8 +119,8 @@ FloodTool::~FloodTool() {
* destroys old and creates new knotholder.
*/
void FloodTool::selection_changed(Inkscape::Selection* selection) {
- this->shape_editor->unset_item(SH_KNOTHOLDER);
- this->shape_editor->set_item(selection->singleItem(), SH_KNOTHOLDER);
+ this->shape_editor->unset_item();
+ this->shape_editor->set_item(selection->singleItem());
}
void FloodTool::setup() {
@@ -130,7 +130,7 @@ void FloodTool::setup() {
SPItem *item = sp_desktop_selection(this->desktop)->singleItem();
if (item) {
- this->shape_editor->set_item(item, SH_KNOTHOLDER);
+ this->shape_editor->set_item(item);
}
this->sel_changed_connection.disconnect();
diff --git a/src/ui/tools/flood-tool.h b/src/ui/tools/flood-tool.h
index 3ed670e8b..5104a42e9 100644
--- a/src/ui/tools/flood-tool.h
+++ b/src/ui/tools/flood-tool.h
@@ -11,9 +11,7 @@
* Released under GNU GPL
*/
-#include <stddef.h>
-#include <sigc++/sigc++.h>
-#include <gtk/gtk.h>
+#include <sigc++/connection.h>
#include "ui/tools/tool-base.h"
#define SP_FLOOD_CONTEXT(obj) (dynamic_cast<Inkscape::UI::Tools::FloodTool*>((Inkscape::UI::Tools::ToolBase*)obj))
diff --git a/src/ui/tools/freehand-base.cpp b/src/ui/tools/freehand-base.cpp
index 37a170bc9..6434c30d2 100644
--- a/src/ui/tools/freehand-base.cpp
+++ b/src/ui/tools/freehand-base.cpp
@@ -30,7 +30,7 @@
#include "desktop-handles.h"
#include "desktop-style.h"
#include "document.h"
-#include "draw-anchor.h"
+#include "ui/draw-anchor.h"
#include "macros.h"
#include "message-stack.h"
#include "ui/tools/pen-tool.h"
@@ -44,6 +44,8 @@
#include "live_effects/lpe-powerstroke.h"
#include "style.h"
#include "ui/control-manager.h"
+// clipboard support
+#include "ui/clipboard.h"
#include "ui/tools/freehand-base.h"
#include <gdk/gdkkeysyms.h>
@@ -78,6 +80,7 @@ FreehandBase::FreehandBase(gchar const *const *cursor_shape, gint hot_x, gint ho
, red_color(0xff00007f)
, blue_color(0x0000ff7f)
, green_color(0x00ff007f)
+ , highlight_color(0x0000007f)
, red_bpath(NULL)
, red_curve(NULL)
, blue_bpath(NULL)
@@ -89,6 +92,7 @@ FreehandBase::FreehandBase(gchar const *const *cursor_shape, gint hot_x, gint ho
, white_item(NULL)
, white_curves(NULL)
, white_anchors(NULL)
+ , overwriteCurve(NULL)
, sa(NULL)
, ea(NULL)
, waiting_LPE_type(Inkscape::LivePathEffect::INVALID_LPE)
@@ -144,6 +148,9 @@ void FreehandBase::setup() {
this->green_anchor = NULL;
this->green_closed = FALSE;
+ // Create start anchor alternative curve
+ this->overwriteCurve = new SPCurve();
+
this->attach = TRUE;
spdc_attach_selection(this, this->selection);
}
@@ -270,8 +277,18 @@ static void spdc_check_for_and_apply_waiting_LPE(FreehandBase *dc, SPItem *item,
if (prefs->getInt(tool_name(dc) + "/freehand-mode", 0) == 1) {
Effect::createAndApply(SPIRO, dc->desktop->doc(), item);
}
+ //add the bspline node in the waiting effects
+ if (prefs->getInt(tool_name(dc) + "/freehand-mode", 0) == 2) {
+ Effect::createAndApply(BSPLINE, dc->desktop->doc(), item);
+ }
+
+ //Store the clipboard path to apply in the future without the use of clipboard
+ static Geom::PathVector previous_shape_pathv;
+ enum shapeType { NONE, TRIANGLE_IN, TRIANGLE_OUT, ELLIPSE, CLIPBOARD, LAST_APPLIED };
+ static shapeType previous_shape_type = NONE;
- int shape = prefs->getInt(tool_name(dc) + "/shape", 0);
+
+ shapeType shape = (shapeType)prefs->getInt(tool_name(dc) + "/shape", 0);
bool shape_applied = false;
SPCSSAttr *css_item = sp_css_attr_from_object(item, SP_STYLE_FLAG_ALWAYS);
const char *cstroke = sp_repr_css_property(css_item, "stroke", "none");
@@ -279,11 +296,18 @@ static void spdc_check_for_and_apply_waiting_LPE(FreehandBase *dc, SPItem *item,
#define SHAPE_LENGTH 10
#define SHAPE_HEIGHT 10
+ if(shape == LAST_APPLIED){
+ shape = previous_shape_type;
+ if(shape == CLIPBOARD){
+ shape = LAST_APPLIED;
+ }
+ }
+
switch (shape) {
- case 0:
+ case NONE:
// don't apply any shape
break;
- case 1:
+ case TRIANGLE_IN:
{
// "triangle in"
std::vector<Geom::Point> points(1);
@@ -293,7 +317,7 @@ static void spdc_check_for_and_apply_waiting_LPE(FreehandBase *dc, SPItem *item,
shape_applied = true;
break;
}
- case 2:
+ case TRIANGLE_OUT:
{
// "triangle out"
guint curve_length = curve->get_segment_count();
@@ -304,7 +328,7 @@ static void spdc_check_for_and_apply_waiting_LPE(FreehandBase *dc, SPItem *item,
shape_applied = true;
break;
}
- case 3:
+ case ELLIPSE:
{
// "ellipse"
SPCurve *c = new SPCurve();
@@ -317,22 +341,40 @@ static void spdc_check_for_and_apply_waiting_LPE(FreehandBase *dc, SPItem *item,
c->closepath();
spdc_paste_curve_as_freehand_shape(c, dc, item);
c->unref();
+
shape_applied = true;
break;
}
- case 4:
+ case CLIPBOARD:
{
// take shape from clipboard; TODO: catch the case where clipboard is empty
Effect::createAndApply(PATTERN_ALONG_PATH, dc->desktop->doc(), item);
Effect* lpe = SP_LPE_ITEM(item)->getCurrentLPE();
static_cast<LPEPatternAlongPath*>(lpe)->pattern.on_paste_button_click();
+ Inkscape::UI::ClipboardManager *cm = Inkscape::UI::ClipboardManager::get();
+ Glib::ustring svgd = cm->getPathParameter(SP_ACTIVE_DESKTOP);
+ previous_shape_pathv = sp_svg_read_pathv(svgd.data());
shape_applied = true;
break;
}
+ case LAST_APPLIED:
+ {
+ if(previous_shape_pathv.size() != 0){
+ SPCurve * c = new SPCurve();
+ c->set_pathvector(previous_shape_pathv);
+ spdc_paste_curve_as_freehand_shape(c, dc, item);
+ c->unref();
+
+ shape_applied = true;
+ }
+ break;
+ }
default:
break;
}
+ previous_shape_type = shape;
+
if (shape_applied) {
// apply original stroke color as fill and unset stroke; then return
SPCSSAttr *css = sp_repr_css_attr_new();
@@ -486,7 +528,7 @@ void spdc_concat_colors_and_flush(FreehandBase *dc, gboolean forceclosed)
{
// Concat RBG
SPCurve *c = dc->green_curve;
-
+ Inkscape::Preferences *prefs = Inkscape::Preferences::get();
// Green
dc->green_curve = new SPCurve();
while (dc->green_bpaths) {
@@ -533,9 +575,20 @@ void spdc_concat_colors_and_flush(FreehandBase *dc, gboolean forceclosed)
if (dc->sa->start && !(dc->sa->curve->is_closed()) ) {
c = reverse_then_unref(c);
}
- dc->sa->curve->append_continuous(c, 0.0625);
- c->unref();
- dc->sa->curve->closepath_current();
+ if(prefs->getInt(tool_name(dc) + "/freehand-mode", 0) == 1 ||
+ prefs->getInt(tool_name(dc) + "/freehand-mode", 0) == 2){
+ dc->overwriteCurve->append_continuous(c, 0.0625);
+ c->unref();
+ dc->overwriteCurve->closepath_current();
+ if(dc->sa){
+ dc->white_curves = g_slist_remove(dc->white_curves, dc->sa->curve);
+ dc->white_curves = g_slist_append(dc->white_curves, dc->overwriteCurve);
+ }
+ }else{
+ dc->sa->curve->append_continuous(c, 0.0625);
+ c->unref();
+ dc->sa->curve->closepath_current();
+ }
spdc_flush_white(dc, NULL);
return;
}
@@ -544,6 +597,10 @@ void spdc_concat_colors_and_flush(FreehandBase *dc, gboolean forceclosed)
if (dc->sa) {
SPCurve *s = dc->sa->curve;
dc->white_curves = g_slist_remove(dc->white_curves, s);
+ if(prefs->getInt(tool_name(dc) + "/freehand-mode", 0) == 1 ||
+ prefs->getInt(tool_name(dc) + "/freehand-mode", 0) == 2){
+ s = dc->overwriteCurve;
+ }
if (dc->sa->start) {
s = reverse_then_unref(s);
}
@@ -556,6 +613,25 @@ void spdc_concat_colors_and_flush(FreehandBase *dc, gboolean forceclosed)
if (!dc->ea->start) {
e = reverse_then_unref(e);
}
+ if(prefs->getInt(tool_name(dc) + "/freehand-mode", 0) == 1 ||
+ prefs->getInt(tool_name(dc) + "/freehand-mode", 0) == 2){
+ e = reverse_then_unref(e);
+ Geom::CubicBezier const * cubic = dynamic_cast<Geom::CubicBezier const*>(&*e->last_segment());
+ SPCurve *lastSeg = new SPCurve();
+ if(cubic){
+ lastSeg->moveto((*cubic)[0]);
+ lastSeg->curveto((*cubic)[1],(*cubic)[3],(*cubic)[3]);
+ if( e->get_segment_count() == 1){
+ e = lastSeg;
+ }else{
+ //we eliminate the last segment
+ e->backspace();
+ //and we add it again with the recreation
+ e->append_continuous(lastSeg, 0.0625);
+ }
+ }
+ e = reverse_then_unref(e);
+ }
c->append_continuous(e, 0.0625);
e->unref();
}
@@ -599,6 +675,7 @@ static void spdc_flush_white(FreehandBase *dc, SPCurve *gc)
bool has_lpe = false;
Inkscape::XML::Node *repr;
+
if (dc->white_item) {
repr = dc->white_item->getRepr();
has_lpe = SP_LPE_ITEM(dc->white_item)->hasPathEffectRecursive();
@@ -662,7 +739,6 @@ SPDrawAnchor *spdc_test_inside(FreehandBase *dc, Geom::Point p)
active = na;
}
}
-
return active;
}
diff --git a/src/ui/tools/freehand-base.h b/src/ui/tools/freehand-base.h
index 5a4b91800..6b4265215 100644
--- a/src/ui/tools/freehand-base.h
+++ b/src/ui/tools/freehand-base.h
@@ -55,6 +55,7 @@ public:
guint32 red_color;
guint32 blue_color;
guint32 green_color;
+ guint32 highlight_color;
// Red
SPCanvasItem *red_bpath;
@@ -75,12 +76,17 @@ public:
GSList *white_curves;
GSList *white_anchors;
+ //ALternative curve to use on continuing exisiting curve in case of bspline or spirolive
+ //because usigh anchor curves give memory and random bugs, - and obscure code- in some plataform reported by su_v in mac
+ SPCurve *overwriteCurve;
+
// Start anchor
SPDrawAnchor *sa;
// End anchor
SPDrawAnchor *ea;
+
/* type of the LPE that is to be applied automatically to a finished path (if any) */
Inkscape::LivePathEffect::EffectType waiting_LPE_type;
diff --git a/src/ui/tools/gradient-tool.cpp b/src/ui/tools/gradient-tool.cpp
index a0bbfbaf1..9c853917e 100644
--- a/src/ui/tools/gradient-tool.cpp
+++ b/src/ui/tools/gradient-tool.cpp
@@ -51,7 +51,7 @@
using Inkscape::DocumentUndo;
-#include "tool-factory.h"
+#include "ui/tool-factory.h"
namespace Inkscape {
namespace UI {
@@ -213,17 +213,20 @@ sp_gradient_context_is_over_line (GradientTool *rc, SPItem *item, Geom::Point ev
//Translate mouse point into proper coord system
rc->mousepoint_doc = desktop->w2d(event_p);
- SPCtrlLine* line = SP_CTRLLINE(item);
+ if (SP_IS_CTRLLINE(item)) {
+ SPCtrlLine* line = SP_CTRLLINE(item);
- Geom::LineSegment ls(line->s, line->e);
- Geom::Point nearest = ls.pointAt(ls.nearestPoint(rc->mousepoint_doc));
- double dist_screen = Geom::L2 (rc->mousepoint_doc - nearest) * desktop->current_zoom();
+ Geom::LineSegment ls(line->s, line->e);
+ Geom::Point nearest = ls.pointAt(ls.nearestPoint(rc->mousepoint_doc));
+ double dist_screen = Geom::L2 (rc->mousepoint_doc - nearest) * desktop->current_zoom();
- double tolerance = (double) SP_EVENT_CONTEXT(rc)->tolerance;
+ double tolerance = (double) SP_EVENT_CONTEXT(rc)->tolerance;
- bool close = (dist_screen < tolerance);
+ bool close = (dist_screen < tolerance);
- return close;
+ return close;
+ }
+ return false;
}
static std::vector<Geom::Point>
diff --git a/src/ui/tools/lpe-tool.cpp b/src/ui/tools/lpe-tool.cpp
index 9ab6d7814..1fd1ebf8c 100644
--- a/src/ui/tools/lpe-tool.cpp
+++ b/src/ui/tools/lpe-tool.cpp
@@ -28,7 +28,7 @@
#include "desktop.h"
#include "message-context.h"
#include "preferences.h"
-#include "shape-editor.h"
+#include "ui/shape-editor.h"
#include "selection.h"
#include "desktop-handles.h"
#include "document.h"
@@ -59,7 +59,7 @@ SubtoolEntry lpesubtools[] = {
};
-#include "tool-factory.h"
+#include "ui/tool-factory.h"
namespace Inkscape {
namespace UI {
@@ -129,8 +129,7 @@ void LpeTool::setup() {
Inkscape::Preferences *prefs = Inkscape::Preferences::get();
if (item) {
- this->shape_editor->set_item(item, SH_NODEPATH);
- this->shape_editor->set_item(item, SH_KNOTHOLDER);
+ this->shape_editor->set_item(item);
}
if (prefs->getBool("/tools/lpetool/selcue")) {
@@ -146,9 +145,9 @@ void sp_lpetool_context_selection_changed(Inkscape::Selection *selection, gpoint
{
LpeTool *lc = SP_LPETOOL_CONTEXT(data);
- lc->shape_editor->unset_item(SH_KNOTHOLDER);
+ lc->shape_editor->unset_item();
SPItem *item = selection->singleItem();
- lc->shape_editor->set_item(item, SH_KNOTHOLDER);
+ lc->shape_editor->set_item(item);
}
void LpeTool::set(const Inkscape::Preferences::Entry& val) {
diff --git a/src/ui/tools/measure-tool.cpp b/src/ui/tools/measure-tool.cpp
index feeb68288..6b5cbeccd 100644
--- a/src/ui/tools/measure-tool.cpp
+++ b/src/ui/tools/measure-tool.cpp
@@ -49,7 +49,7 @@ using Inkscape::ControlManager;
using Inkscape::CTLINE_SECONDARY;
using Inkscape::Util::unit_table;
-#include "tool-factory.h"
+#include "ui/tool-factory.h"
namespace Inkscape {
namespace UI {
diff --git a/src/ui/tools/mesh-tool.cpp b/src/ui/tools/mesh-tool.cpp
index 7d6d3bc23..8a1fb7c72 100644
--- a/src/ui/tools/mesh-tool.cpp
+++ b/src/ui/tools/mesh-tool.cpp
@@ -53,7 +53,7 @@
using Inkscape::DocumentUndo;
-#include "tool-factory.h"
+#include "ui/tool-factory.h"
namespace Inkscape {
namespace UI {
diff --git a/src/ui/tools/node-tool.cpp b/src/ui/tools/node-tool.cpp
index 4be547506..e2bb85d11 100644
--- a/src/ui/tools/node-tool.cpp
+++ b/src/ui/tools/node-tool.cpp
@@ -23,7 +23,9 @@
#include "live_effects/lpeobject.h"
#include "message-context.h"
#include "selection.h"
-#include "shape-editor.h" // temporary!
+#include "ui/shape-editor.h" // temporary!
+#include "live_effects/effect.h"
+#include "display/curve.h"
#include "sp-clippath.h"
#include "sp-item-group.h"
#include "sp-mask.h"
@@ -105,7 +107,7 @@
using Inkscape::ControlManager;
-#include "tool-factory.h"
+#include "ui/tool-factory.h"
namespace Inkscape {
namespace UI {
@@ -171,6 +173,10 @@ NodeTool::~NodeTool() {
this->desktop->remove_temporary_canvasitem(this->helperpath_tmpitem);
}
+ if (this->helperpath_tmpitem) {
+ this->desktop->remove_temporary_canvasitem(this->helperpath_tmpitem);
+ }
+
this->_selection_changed_connection.disconnect();
//this->_selection_modified_connection.disconnect();
this->_mouseover_changed_connection.disconnect();
@@ -239,7 +245,7 @@ void NodeTool::setup() {
)
);
- this->_selected_nodes->signal_point_changed.connect(
+ this->_selected_nodes->signal_selection_changed.connect(
// Hide both signal parameters and bind the function parameter to 0
// sigc::signal<void, SelectableControlPoint *, bool>
// <=>
@@ -257,6 +263,7 @@ void NodeTool::setup() {
this->flash_tempitem = NULL;
this->flashed_item = NULL;
this->_last_over = NULL;
+ this->helperpath_tmpitem = NULL;
// read prefs before adding items to selection to prevent momentarily showing the outline
sp_event_context_read(this, "show_handles");
@@ -435,7 +442,7 @@ void NodeTool::selection_changed(Inkscape::Selection *sel) {
this->_shape_editors.find(r.item) == this->_shape_editors.end())
{
ShapeEditor *si = new ShapeEditor(this->desktop);
- si->set_item(r.item, SH_KNOTHOLDER);
+ si->set_item(r.item);
this->_shape_editors.insert(const_cast<SPItem*&>(r.item), si);
}
}
@@ -455,7 +462,7 @@ bool NodeTool::root_handler(GdkEvent* event) {
Inkscape::Selection *selection = desktop->selection;
static Inkscape::Preferences *prefs = Inkscape::Preferences::get();
-
+
if (this->_multipath->event(this, event)) {
return true;
}
@@ -473,6 +480,7 @@ bool NodeTool::root_handler(GdkEvent* event) {
case GDK_MOTION_NOTIFY: {
this->update_helperpath();
combine_motion_events(desktop->canvas, event->motion, 0);
+ this->update_helperpath();
SPItem *over_item = sp_event_context_find_item (desktop, event_point(event->button),
FALSE, TRUE);
@@ -481,7 +489,6 @@ bool NodeTool::root_handler(GdkEvent* event) {
//ink_node_tool_update_tip(nt, event);
this->update_tip(event);
}
-
// create pathflash outline
if (prefs->getBool("/tools/nodes/pathflash_enabled")) {
if (over_item == this->flashed_item) {
@@ -513,7 +520,8 @@ bool NodeTool::root_handler(GdkEvent* event) {
SPCanvasItem *flash = sp_canvas_bpath_new(sp_desktop_tempgroup(desktop), c);
sp_canvas_bpath_set_stroke(SP_CANVAS_BPATH(flash),
- prefs->getInt("/tools/nodes/highlight_color", 0xff0000ff), 1.0,
+ //prefs->getInt("/tools/nodes/highlight_color", 0xff0000ff), 1.0,
+ over_item->highlight_color(), 1.0,
SP_STROKE_LINEJOIN_MITER, SP_STROKE_LINECAP_BUTT);
sp_canvas_bpath_set_fill(SP_CANVAS_BPATH(flash), 0, SP_WIND_RULE_NONZERO);
diff --git a/src/ui/tools/node-tool.h b/src/ui/tools/node-tool.h
index 459ecd0a7..ab72f3632 100644
--- a/src/ui/tools/node-tool.h
+++ b/src/ui/tools/node-tool.h
@@ -15,6 +15,9 @@
#include <glib.h>
#include "ui/tools/tool-base.h"
+// we need it to call it from Live Effect
+#include "selection.h"
+
namespace Inkscape {
namespace Display {
class TemporaryItem;
diff --git a/src/ui/tools/pen-tool.cpp b/src/ui/tools/pen-tool.cpp
index 649c64034..92937a135 100644
--- a/src/ui/tools/pen-tool.cpp
+++ b/src/ui/tools/pen-tool.cpp
@@ -26,7 +26,7 @@
#include "desktop-handles.h"
#include "selection.h"
#include "selection-chemistry.h"
-#include "draw-anchor.h"
+#include "ui/draw-anchor.h"
#include "message-stack.h"
#include "message-context.h"
#include "preferences.h"
@@ -40,9 +40,40 @@
#include <glibmm/i18n.h>
#include "macros.h"
#include "context-fns.h"
-#include "tools-switch.h"
+#include "ui/tools-switch.h"
#include "ui/control-manager.h"
-#include "tool-factory.h"
+// we include the necessary files for BSpline & Spiro
+#include "live_effects/effect.h"
+#include "live_effects/lpeobject.h"
+#include "live_effects/lpeobject-reference.h"
+#include "live_effects/parameter/path.h"
+#define INKSCAPE_LPE_SPIRO_C
+#include "live_effects/lpe-spiro.h"
+
+
+#include <typeinfo>
+#include <2geom/pathvector.h>
+#include <2geom/affine.h>
+#include <2geom/bezier-curve.h>
+#include <2geom/hvlinesegment.h>
+#include "helper/geom-nodetype.h"
+#include "helper/geom-curves.h"
+
+// For handling un-continuous paths:
+#include "message-stack.h"
+#include "inkscape.h"
+#include "desktop.h"
+
+#include "live_effects/spiro.h"
+
+#define INKSCAPE_LPE_BSPLINE_C
+#include "live_effects/lpe-bspline.h"
+#include <2geom/nearest-point.h>
+
+#include "ui/tool-factory.h"
+
+#include "live_effects/effect.h"
+
using Inkscape::ControlManager;
@@ -53,7 +84,7 @@ namespace Tools {
static Geom::Point pen_drag_origin_w(0, 0);
static bool pen_within_tolerance = false;
static int pen_last_paraxial_dir = 0; // last used direction in horizontal/vertical mode; 0 = horizontal, 1 = vertical
-
+const double handleCubicGap = 0.01;
namespace {
ToolBase* createPenContext() {
return new PenTool();
@@ -135,8 +166,22 @@ PenTool::~PenTool() {
void PenTool::setPolylineMode() {
Inkscape::Preferences *prefs = Inkscape::Preferences::get();
guint mode = prefs->getInt("/tools/freehand/pen/freehand-mode", 0);
- this->polylines_only = (mode == 2 || mode == 3);
- this->polylines_paraxial = (mode == 3);
+ // change the nodes to make space for bspline mode
+ this->polylines_only = (mode == 3 || mode == 4);
+ this->polylines_paraxial = (mode == 4);
+ //we call the function which defines the Spiro modes and the BSpline
+ //todo: merge to one function only
+ this->_pen_context_set_mode(mode);
+}
+
+/*
+*.Set the mode of draw spiro, and bsplines
+*/
+void PenTool::_pen_context_set_mode(guint mode) {
+ // define the nodes
+ this->spiro = (mode == 1);
+ this->bspline = (mode == 2);
+ this->_bspline_spiro_color();
}
/**
@@ -144,7 +189,6 @@ void PenTool::setPolylineMode() {
*/
void PenTool::setup() {
FreehandBase::setup();
-
ControlManager &mgr = ControlManager::getManager();
// Pen indicators
@@ -195,7 +239,9 @@ void PenTool::finish() {
sp_event_context_discard_delayed_snap_event(this);
if (this->npoints != 0) {
- this->_cancel();
+ // switching context - finish path
+ this->ea = NULL; // unset end anchor if set (otherwise crashes)
+ this->_finish(false);
}
FreehandBase::finish();
@@ -332,9 +378,20 @@ bool PenTool::_handleButtonPress(GdkEventButton const &bevent) {
Geom::Point const event_w(bevent.x, bevent.y);
Geom::Point event_dt(desktop->w2d(event_w));
-
+ //Test whether we hit any anchor.
+ SPDrawAnchor * const anchor = spdc_test_inside(this, event_w);
+
+ //with this we avoid creating a new point over the existing one
+ if(bevent.button != 3 && (this->spiro || this->bspline) && this->npoints > 0 && this->p[0] == this->p[3]){
+ if( anchor && anchor == this->sa && this->green_curve->is_empty()){
+ //remove the following line to avoid having one node on top of another
+ _finishSegment(event_dt, bevent.state);
+ _finish( false);
+ return true;
+ }
+ return false;
+ }
bool ret = false;
-
if (bevent.button == 1 && !this->space_panning
// make sure this is not the last click for a waiting LPE (otherwise we want to finish the path)
&& this->expecting_clicks_for_LPE != 1) {
@@ -355,10 +412,8 @@ bool PenTool::_handleButtonPress(GdkEventButton const &bevent) {
pen_drag_origin_w = event_w;
pen_within_tolerance = true;
- // Test whether we hit any anchor.
- SPDrawAnchor * const anchor = spdc_test_inside(this, event_w);
-
switch (this->mode) {
+
case PenTool::MODE_CLICK:
// In click mode we add point on release
switch (this->state) {
@@ -380,7 +435,7 @@ bool PenTool::_handleButtonPress(GdkEventButton const &bevent) {
// This is allowed, if we just canceled curve
case PenTool::POINT:
if (this->npoints == 0) {
-
+ this->_bspline_spiro_color();
Geom::Point p;
if ((bevent.state & GDK_CONTROL_MASK) && (this->polylines_only || this->polylines_paraxial)) {
p = event_dt;
@@ -399,8 +454,12 @@ bool PenTool::_handleButtonPress(GdkEventButton const &bevent) {
// distinction so that the case of a waiting LPE is treated separately
// Set start anchor
+
this->sa = anchor;
- if (anchor && !this->hasWaitingLPE()) {
+ if(anchor){
+ this->_bspline_spiro_start_anchor(bevent.state & GDK_SHIFT_MASK);
+ }
+ if (anchor && (!this->hasWaitingLPE()|| this->bspline || this->spiro)) {
// Adjust point to anchor if needed; if we have a waiting LPE, we need
// a fresh path to be created so don't continue an existing one
p = anchor->dp;
@@ -422,7 +481,7 @@ bool PenTool::_handleButtonPress(GdkEventButton const &bevent) {
// Create green anchor
p = event_dt;
this->_endpointSnap(p, bevent.state);
- this->green_anchor = sp_draw_anchor_new(this, this->green_curve, TRUE, p);
+ this->green_anchor = sp_draw_anchor_new(this, this->green_curve, true, p);
}
this->_setInitialPoint(p);
} else {
@@ -439,7 +498,7 @@ bool PenTool::_handleButtonPress(GdkEventButton const &bevent) {
if (this->green_anchor && this->green_anchor->active) {
// we clicked on the current curve start, so close it even if
// we drag a handle away from it
- this->green_closed = TRUE;
+ this->green_closed = true;
}
ret = true;
break;
@@ -450,8 +509,8 @@ bool PenTool::_handleButtonPress(GdkEventButton const &bevent) {
this->_setSubsequentPoint(p, true);
}
}
-
- this->state = this->polylines_only ? PenTool::POINT : PenTool::CONTROL;
+ // avoid the creation of a control point so a node is created in the release event
+ this->state = (this->spiro || this->bspline || this->polylines_only) ? PenTool::POINT : PenTool::CONTROL;
ret = true;
break;
case PenTool::CONTROL:
@@ -511,9 +570,11 @@ bool PenTool::_handleMotionNotify(GdkEventMotion const &mevent) {
Geom::Point const event_w(mevent.x, mevent.y);
+ //we take out the function the const "tolerance" because we need it later
+ Inkscape::Preferences *prefs = Inkscape::Preferences::get();
+ gint const tolerance = prefs->getIntLimited("/options/dragtolerance/value", 0, 0, 100);
+
if (pen_within_tolerance) {
- Inkscape::Preferences *prefs = Inkscape::Preferences::get();
- gint const tolerance = prefs->getIntLimited("/options/dragtolerance/value", 0, 0, 100);
if ( Geom::LInfty( event_w - pen_drag_origin_w ) < tolerance ) {
return false; // Do not drag if we're within tolerance from origin.
}
@@ -537,7 +598,7 @@ bool PenTool::_handleMotionNotify(GdkEventMotion const &mevent) {
// Only set point, if we are already appending
this->_endpointSnap(p, mevent.state);
this->_setSubsequentPoint(p, true);
- ret = TRUE;
+ ret = true;
} else if (!this->sp_event_context_knot_mouseover()) {
SnapManager &m = desktop->namedview->snap_manager;
m.setup(desktop);
@@ -573,7 +634,11 @@ bool PenTool::_handleMotionNotify(GdkEventMotion const &mevent) {
}
if (anchor && !this->anchor_statusbar) {
- this->message_context->set(Inkscape::NORMAL_MESSAGE, _("<b>Click</b> or <b>click and drag</b> to close and finish the path."));
+ if(!this->spiro && !this->bspline){
+ this->message_context->set(Inkscape::NORMAL_MESSAGE, _("<b>Click</b> or <b>click and drag</b> to close and finish the path."));
+ }else{
+ this->message_context->set(Inkscape::NORMAL_MESSAGE, _("<b>Click</b> or <b>click and drag</b> to close and finish the path. Shift+Click make a cusp node"));
+ }
this->anchor_statusbar = true;
} else if (!anchor && this->anchor_statusbar) {
this->message_context->clear();
@@ -583,11 +648,16 @@ bool PenTool::_handleMotionNotify(GdkEventMotion const &mevent) {
ret = true;
} else {
if (anchor && !this->anchor_statusbar) {
- this->message_context->set(Inkscape::NORMAL_MESSAGE, _("<b>Click</b> or <b>click and drag</b> to continue the path from this point."));
+ if(!this->spiro && !this->bspline){
+ this->message_context->set(Inkscape::NORMAL_MESSAGE, _("<b>Click</b> or <b>click and drag</b> to continue the path from this point."));
+ }else{
+ this->message_context->set(Inkscape::NORMAL_MESSAGE, _("<b>Click</b> or <b>click and drag</b> to continue the path from this point. Shift+Click make a cusp node"));
+ }
this->anchor_statusbar = true;
} else if (!anchor && this->anchor_statusbar) {
this->message_context->clear();
this->anchor_statusbar = false;
+
}
if (!this->sp_event_context_knot_mouseover()) {
SnapManager &m = desktop->namedview->snap_manager;
@@ -602,6 +672,7 @@ bool PenTool::_handleMotionNotify(GdkEventMotion const &mevent) {
// Placing controls is last operation in CLOSE state
// snap the handle
+
this->_endpointSnapHandle(p, mevent.state);
if (!this->polylines_only) {
@@ -609,6 +680,7 @@ bool PenTool::_handleMotionNotify(GdkEventMotion const &mevent) {
} else {
this->_setCtrl(this->p[1], mevent.state);
}
+
gobble_motion_events(GDK_BUTTON1_MASK);
ret = true;
break;
@@ -628,6 +700,16 @@ bool PenTool::_handleMotionNotify(GdkEventMotion const &mevent) {
default:
break;
}
+ // calls the function "bspline_spiro_motion" when the mouse starts or stops moving
+ if(this->bspline){
+ this->_bspline_spiro_motion(mevent.state & GDK_SHIFT_MASK);
+ }else{
+ if ( Geom::LInfty( event_w - pen_drag_origin_w ) > (tolerance/2) || mevent.time == 0) {
+ this->_bspline_spiro_motion(mevent.state & GDK_SHIFT_MASK);
+ pen_drag_origin_w = event_w;
+ }
+ }
+
return ret;
}
@@ -649,7 +731,12 @@ bool PenTool::_handleButtonRelease(GdkEventButton const &revent) {
Geom::Point p = this->desktop->w2d(event_w);
// Test whether we hit any anchor.
+
SPDrawAnchor *anchor = spdc_test_inside(this, event_w);
+ // if we try to create a node in the same place as another node, we skip
+ if((!anchor || anchor == this->sa) && (this->spiro || this->bspline) && this->npoints > 0 && this->p[0] == this->p[3]){
+ return true;
+ }
switch (this->mode) {
case PenTool::MODE_CLICK:
@@ -657,10 +744,17 @@ bool PenTool::_handleButtonRelease(GdkEventButton const &revent) {
case PenTool::POINT:
if ( this->npoints == 0 ) {
// Start new thread only with button release
+ this->_bspline_spiro_color();
if (anchor) {
p = anchor->dp;
}
this->sa = anchor;
+ // continue the existing curve
+ if (anchor) {
+ if(this->bspline || this->spiro){
+ this->_bspline_spiro_start_anchor(revent.state & GDK_SHIFT_MASK);;
+ }
+ }
this->_setInitialPoint(p);
} else {
// Set end anchor here
@@ -685,6 +779,10 @@ bool PenTool::_handleButtonRelease(GdkEventButton const &revent) {
this->_endpointSnap(p, revent.state);
}
this->_finishSegment(p, revent.state);
+ // hude the guide of the penultimate node when closing the curve
+ if(this->spiro){
+ sp_canvas_item_hide(this->c1);
+ }
this->_finish(true);
this->state = PenTool::POINT;
ret = true;
@@ -708,6 +806,10 @@ bool PenTool::_handleButtonRelease(GdkEventButton const &revent) {
case PenTool::CLOSE:
this->_endpointSnap(p, revent.state);
this->_finishSegment(p, revent.state);
+ // hide the penultimate node guide when closing the curve
+ if(this->spiro){
+ sp_canvas_item_hide(this->c1);
+ }
if (this->green_closed) {
// finishing at the start anchor, close curve
this->_finish(true);
@@ -728,7 +830,6 @@ bool PenTool::_handleButtonRelease(GdkEventButton const &revent) {
default:
break;
}
-
if (this->grab) {
// Release grab now
sp_canvas_item_ungrab(this->grab, revent.time);
@@ -737,7 +838,7 @@ bool PenTool::_handleButtonRelease(GdkEventButton const &revent) {
ret = true;
- this->green_closed = FALSE;
+ this->green_closed = false;
}
// TODO: can we be sure that the path was created correctly?
@@ -765,7 +866,7 @@ bool PenTool::_handle2ButtonPress(GdkEventButton const &bevent) {
bool ret = false;
// only end on LMB double click. Otherwise horizontal scrolling causes ending of the path
if (this->npoints != 0 && bevent.button == 1) {
- this->_finish(FALSE);
+ this->_finish(false);
ret = true;
}
return ret;
@@ -786,7 +887,6 @@ void PenTool::_redrawAll() {
this->green_bpaths = g_slist_prepend(this->green_bpaths, cshape);
}
-
if (this->green_anchor)
SP_CTRL(this->green_anchor->ctrl)->moveto(this->green_anchor->dp);
@@ -796,7 +896,8 @@ void PenTool::_redrawAll() {
sp_canvas_bpath_set_bpath(SP_CANVAS_BPATH(this->red_bpath), this->red_curve);
// handles
- if (this->p[0] != this->p[1]) {
+ // hide the handlers in bspline and spiro modes
+ if (this->p[0] != this->p[1] && !this->spiro && !this->bspline) {
SP_CTRL(this->c1)->moveto(this->p[1]);
this->cl1->setCoords(this->p[0], this->p[1]);
sp_canvas_item_show(this->c1);
@@ -809,8 +910,9 @@ void PenTool::_redrawAll() {
Geom::Curve const * last_seg = this->green_curve->last_segment();
if (last_seg) {
Geom::CubicBezier const * cubic = dynamic_cast<Geom::CubicBezier const *>( last_seg );
+ // hide the handlers in bspline and spiro modes
if ( cubic &&
- (*cubic)[2] != this->p[0] )
+ (*cubic)[2] != this->p[0] && !this->spiro && !this->bspline )
{
Geom::Point p2 = (*cubic)[2];
SP_CTRL(this->c0)->moveto(p2);
@@ -822,6 +924,10 @@ void PenTool::_redrawAll() {
sp_canvas_item_hide(this->cl0);
}
}
+
+ // simply redraw the spiro. because its a redrawing, we don't call the global function,
+ // but we call the redrawing at the ending.
+ this->_bspline_spiro_build();
}
void PenTool::_lastpointMove(gdouble x, gdouble y) {
@@ -839,6 +945,7 @@ void PenTool::_lastpointMove(gdouble x, gdouble y) {
}
// red
+
this->p[0] += Geom::Point(x, y);
this->p[1] += Geom::Point(x, y);
this->_redrawAll();
@@ -849,25 +956,105 @@ void PenTool::_lastpointMoveScreen(gdouble x, gdouble y) {
}
void PenTool::_lastpointToCurve() {
- if (this->npoints != 5)
+ // avoid that if the "red_curve" contains only two points ( rect ), it doesn't stop here.
+ if (this->npoints != 5 && !this->spiro && !this->bspline)
return;
- Geom::CubicBezier const * cubic = dynamic_cast<Geom::CubicBezier const *>( this->green_curve->last_segment() );
- if ( cubic ) {
- this->p[1] = this->p[0] + (Geom::Point)( (*cubic)[3] - (*cubic)[2] );
- } else {
- this->p[1] = this->p[0] + (1./3)*(this->p[3] - this->p[0]);
+ this->p[1] = this->red_curve->last_segment()->initialPoint() + (1./3.)*(this->red_curve->last_segment()->finalPoint() - this->red_curve->last_segment()->initialPoint());
+ //modificate the last segment of the green curve so it creates the type of node we need
+ if (this->spiro||this->bspline) {
+ if (!this->green_curve->is_empty()) {
+ Geom::Point A(0,0);
+ Geom::Point B(0,0);
+ Geom::Point C(0,0);
+ Geom::Point D(0,0);
+ Geom::CubicBezier const *cubic = dynamic_cast<Geom::CubicBezier const *>( this->green_curve->last_segment() );
+ //We obtain the last segment 4 points in the previous curve
+ if ( cubic ){
+ A = (*cubic)[0];
+ B = (*cubic)[1];
+ if (this->spiro) {
+ C = this->p[0] + (this->p[0] - this->p[1]);
+ } else {
+ C = this->green_curve->last_segment()->finalPoint() + (1./3.)*(this->green_curve->last_segment()->initialPoint() - this->green_curve->last_segment()->finalPoint());
+ }
+ D = (*cubic)[3];
+ } else {
+ A = this->green_curve->last_segment()->initialPoint();
+ B = this->green_curve->last_segment()->initialPoint();
+ if (this->spiro) {
+ C = this->p[0] + (this->p[0] - this->p[1]);
+ } else {
+ C = this->green_curve->last_segment()->finalPoint() + (1./3.)*(this->green_curve->last_segment()->initialPoint() - this->green_curve->last_segment()->finalPoint());
+ }
+ D = this->green_curve->last_segment()->finalPoint();
+ }
+ SPCurve *previous = new SPCurve();
+ previous->moveto(A);
+ previous->curveto(B, C, D);
+ if ( this->green_curve->get_segment_count() == 1) {
+ this->green_curve = previous;
+ } else {
+ //we eliminate the last segment
+ this->green_curve->backspace();
+ //and we add it again with the recreation
+ this->green_curve->append_continuous(previous, 0.0625);
+ }
+ }
+ //if the last node is an union with another curve
+ if (this->green_curve->is_empty() && this->sa && !this->sa->curve->is_empty()) {
+ this->_bspline_spiro_start_anchor(false);
+ }
}
this->_redrawAll();
}
+
void PenTool::_lastpointToLine() {
- if (this->npoints != 5)
+ // avoid that if the "red_curve" contains only two points ( rect) it doesn't stop here.
+ if (this->npoints != 5 && !this->bspline)
return;
+ // modify the last segment of the green curve so the type of node we want is created.
+ if(this->spiro || this->bspline){
+ if(!this->green_curve->is_empty()){
+ Geom::Point A(0,0);
+ Geom::Point B(0,0);
+ Geom::Point C(0,0);
+ Geom::Point D(0,0);
+ SPCurve * previous = new SPCurve();
+ Geom::CubicBezier const * cubic = dynamic_cast<Geom::CubicBezier const *>( this->green_curve->last_segment() );
+ if ( cubic ) {
+ A = this->green_curve->last_segment()->initialPoint();
+ B = (*cubic)[1];
+ C = this->green_curve->last_segment()->finalPoint();
+ D = C;
+ } else {
+ //We obtain the last segment 4 points in the previous curve
+ A = this->green_curve->last_segment()->initialPoint();
+ B = A;
+ C = this->green_curve->last_segment()->finalPoint();
+ D = C;
+ }
+ previous->moveto(A);
+ previous->curveto(B, C, D);
+ if( this->green_curve->get_segment_count() == 1){
+ this->green_curve = previous;
+ }else{
+ //we eliminate the last segment
+ this->green_curve->backspace();
+ //and we add it again with the recreation
+ this->green_curve->append_continuous(previous, 0.0625);
+ }
+ }
+ // if the last node is an union with another curve
+ if(this->green_curve->is_empty() && this->sa && !this->sa->curve->is_empty()){
+ this->_bspline_spiro_start_anchor(true);
+ }
+ }
+
this->p[1] = this->p[0];
-
this->_redrawAll();
}
@@ -972,7 +1159,7 @@ bool PenTool::_handleKeyPress(GdkEvent *event) {
case GDK_KEY_p:
if (MOD__SHIFT_ONLY(event)) {
sp_pen_context_wait_for_LPE_mouse_clicks(pc, Inkscape::LivePathEffect::PARALLEL, 2);
- ret = TRUE;
+ ret = true;
}
break;
@@ -980,7 +1167,7 @@ bool PenTool::_handleKeyPress(GdkEvent *event) {
case GDK_KEY_c:
if (MOD__SHIFT_ONLY(event)) {
sp_pen_context_wait_for_LPE_mouse_clicks(pc, Inkscape::LivePathEffect::CIRCLE_3PTS, 3);
- ret = TRUE;
+ ret = true;
}
break;
@@ -988,7 +1175,7 @@ bool PenTool::_handleKeyPress(GdkEvent *event) {
case GDK_KEY_b:
if (MOD__SHIFT_ONLY(event)) {
sp_pen_context_wait_for_LPE_mouse_clicks(pc, Inkscape::LivePathEffect::PERP_BISECTOR, 2);
- ret = TRUE;
+ ret = true;
}
break;
@@ -996,7 +1183,7 @@ bool PenTool::_handleKeyPress(GdkEvent *event) {
case GDK_KEY_a:
if (MOD__SHIFT_ONLY(event)) {
sp_pen_context_wait_for_LPE_mouse_clicks(pc, Inkscape::LivePathEffect::ANGLE_BISECTOR, 3);
- ret = TRUE;
+ ret = true;
}
break;
*/
@@ -1071,15 +1258,23 @@ bool PenTool::_handleKeyPress(GdkEvent *event) {
g_warning("pen_handle_key_press, case GDK_KP_Delete: Green curve is empty");
break;
}
- // The code below assumes that pc->green_curve has only ONE path !
+ // The code below assumes that this->green_curve has only ONE path !
Geom::Curve const * crv = this->green_curve->last_segment();
this->p[0] = crv->initialPoint();
if ( Geom::CubicBezier const * cubic = dynamic_cast<Geom::CubicBezier const *>(crv)) {
this->p[1] = (*cubic)[1];
+
} else {
this->p[1] = this->p[0];
}
+
+ // asign the value in a third of the distance of the last segment.
+ if (this->bspline){
+ this->p[1] = this->p[0] + (1./3)*(this->p[3] - this->p[0]);
+ }
+
Geom::Point const pt( (this->npoints < 4) ? crv->finalPoint() : this->p[3] );
+
this->npoints = 2;
// delete the last segment of the green curve
if (this->green_curve->get_segment_count() == 1) {
@@ -1094,6 +1289,18 @@ bool PenTool::_handleKeyPress(GdkEvent *event) {
} else {
this->green_curve->backspace();
}
+
+ // assign the value of this->p[1] to the oposite of the green line last segment
+ if (this->spiro){
+ Geom::CubicBezier const *cubic = dynamic_cast<Geom::CubicBezier const *>(this->green_curve->last_segment());
+ if ( cubic ) {
+ this->p[1] = (*cubic)[3] + (*cubic)[3] - (*cubic)[2];
+ SP_CTRL(this->c1)->moveto(this->p[0]);
+ } else {
+ this->p[1] = this->p[0];
+ }
+ }
+
sp_canvas_item_hide(this->c0);
sp_canvas_item_hide(this->c1);
sp_canvas_item_hide(this->cl0);
@@ -1101,6 +1308,9 @@ bool PenTool::_handleKeyPress(GdkEvent *event) {
this->state = PenTool::POINT;
this->_setSubsequentPoint(pt, true);
pen_last_paraxial_dir = !pen_last_paraxial_dir;
+
+ //redraw
+ this->_bspline_spiro_build();
ret = true;
}
break;
@@ -1167,11 +1377,686 @@ void PenTool::_setAngleDistanceStatusMessage(Geom::Point const p, int pc_point_t
}
this->message_context->setF(Inkscape::IMMEDIATE_MESSAGE, message, angle, dist->str);
- g_string_free(dist, FALSE);
+ g_string_free(dist, false);
+}
+
+// this function changes the colors red, green and blue making them transparent or not, depending on if spiro is being used.
+void PenTool::_bspline_spiro_color()
+{
+ static Inkscape::Preferences *prefs = Inkscape::Preferences::get();
+ if(this->spiro){
+ this->red_color = 0xff00000;
+ this->green_color = 0x00ff000;
+ }else if(this->bspline){
+ this->highlight_color = SP_ITEM(this->desktop->currentLayer())->highlight_color();
+ if((unsigned int)prefs->getInt("/tools/nodes/highlight_color", 0xff0000ff) == this->highlight_color){
+ this->green_color = 0xff00007f;
+ this->red_color = 0xff00007f;
+ } else {
+ this->green_color = this->highlight_color;
+ this->red_color = this->highlight_color;
+ }
+ }else{
+ this->highlight_color = SP_ITEM(this->desktop->currentLayer())->highlight_color();
+ this->red_color = 0xff00007f;
+ if((unsigned int)prefs->getInt("/tools/nodes/highlight_color", 0xff0000ff) == this->highlight_color){
+ this->green_color = 0x00ff007f;
+ } else {
+ this->green_color = this->highlight_color;
+ }
+ sp_canvas_item_hide(this->blue_bpath);
+ }
+ //We erase all the "green_bpaths" to recreate them after with the colour
+ //transparency recently modified
+ if (this->green_bpaths) {
+ // remove old piecewise green canvasitems
+ while (this->green_bpaths) {
+ sp_canvas_item_destroy(SP_CANVAS_ITEM(this->green_bpaths->data));
+ this->green_bpaths = g_slist_remove(this->green_bpaths, this->green_bpaths->data);
+ }
+ // one canvas bpath for all of green_curve
+ SPCanvasItem *cshape = sp_canvas_bpath_new(sp_desktop_sketch(this->desktop), this->green_curve);
+ sp_canvas_bpath_set_stroke(SP_CANVAS_BPATH(cshape), this->green_color, 1.0, SP_STROKE_LINEJOIN_MITER, SP_STROKE_LINECAP_BUTT);
+ sp_canvas_bpath_set_fill(SP_CANVAS_BPATH(cshape), 0, SP_WIND_RULE_NONZERO);
+ this->green_bpaths = g_slist_prepend(this->green_bpaths, cshape);
+ }
+ sp_canvas_bpath_set_stroke(SP_CANVAS_BPATH(this->red_bpath), this->red_color, 1.0, SP_STROKE_LINEJOIN_MITER, SP_STROKE_LINECAP_BUTT);
+}
+
+
+void PenTool::_bspline_spiro(bool shift)
+{
+ if(!this->spiro && !this->bspline)
+ return;
+
+ shift?this->_bspline_spiro_off():this->_bspline_spiro_on();
+ this->_bspline_spiro_build();
+}
+
+void PenTool::_bspline_spiro_on()
+{
+ if(!this->red_curve->is_empty()){
+ using Geom::X;
+ using Geom::Y;
+ this->npoints = 5;
+ this->p[0] = this->red_curve->first_segment()->initialPoint();
+ this->p[3] = this->red_curve->first_segment()->finalPoint();
+ this->p[2] = this->p[3] + (1./3)*(this->p[0] - this->p[3]);
+ this->p[2] = Geom::Point(this->p[2][X] + handleCubicGap,this->p[2][Y] + handleCubicGap);
+ }
+}
+
+void PenTool::_bspline_spiro_off()
+{
+ if(!this->red_curve->is_empty()){
+ this->npoints = 5;
+ this->p[0] = this->red_curve->first_segment()->initialPoint();
+ this->p[3] = this->red_curve->first_segment()->finalPoint();
+ this->p[2] = this->p[3];
+ }
+}
+
+void PenTool::_bspline_spiro_start_anchor(bool shift)
+{
+ if(this->sa->curve->is_empty()){
+ return;
+ }
+
+ LivePathEffect::LPEBSpline *lpe_bsp = NULL;
+
+ if (SP_IS_LPE_ITEM(this->white_item) && SP_LPE_ITEM(this->white_item)->hasPathEffect()){
+ Inkscape::LivePathEffect::Effect* thisEffect = SP_LPE_ITEM(this->white_item)->getPathEffectOfType(Inkscape::LivePathEffect::BSPLINE);
+ if(thisEffect){
+ lpe_bsp = dynamic_cast<LivePathEffect::LPEBSpline*>(thisEffect->getLPEObj()->get_lpe());
+ }
+ }
+ if(lpe_bsp){
+ this->bspline = true;
+ }else{
+ this->bspline = false;
+ }
+ LivePathEffect::LPESpiro *lpe_spi = NULL;
+
+ if (SP_IS_LPE_ITEM(this->white_item) && SP_LPE_ITEM(this->white_item)->hasPathEffect()){
+ Inkscape::LivePathEffect::Effect* thisEffect = SP_LPE_ITEM(this->white_item)->getPathEffectOfType(Inkscape::LivePathEffect::SPIRO);
+ if(thisEffect){
+ lpe_spi = dynamic_cast<LivePathEffect::LPESpiro*>(thisEffect->getLPEObj()->get_lpe());
+ }
+ }
+ if(lpe_spi){
+ this->spiro = true;
+ }else{
+ this->spiro = false;
+ }
+ if(!this->spiro && !this->bspline)
+ return;
+
+ if(shift)
+ this->_bspline_spiro_start_anchor_off();
+ else
+ this->_bspline_spiro_start_anchor_on();
+}
+
+void PenTool::_bspline_spiro_start_anchor_on()
+{
+ using Geom::X;
+ using Geom::Y;
+ SPCurve *tmpCurve = new SPCurve();
+ tmpCurve = this->sa->curve->copy();
+ if(this->sa->start)
+ tmpCurve = tmpCurve->create_reverse();
+ Geom::CubicBezier const * cubic = dynamic_cast<Geom::CubicBezier const*>(&*tmpCurve->last_segment());
+ SPCurve *lastSeg = new SPCurve();
+ Geom::Point A = tmpCurve->last_segment()->initialPoint();
+ Geom::Point D = tmpCurve->last_segment()->finalPoint();
+ Geom::Point C = D + (1./3)*(A - D);
+ C = Geom::Point(C[X] + handleCubicGap,C[Y] + handleCubicGap);
+ if(cubic){
+ lastSeg->moveto(A);
+ lastSeg->curveto((*cubic)[1],C,D);
+ }else{
+ lastSeg->moveto(A);
+ lastSeg->curveto(A,C,D);
+ }
+ if( tmpCurve->get_segment_count() == 1){
+ tmpCurve = lastSeg;
+ }else{
+ //we eliminate the last segment
+ tmpCurve->backspace();
+ //and we add it again with the recreation
+ tmpCurve->append_continuous(lastSeg, 0.0625);
+ }
+ if (this->sa->start) {
+ tmpCurve = tmpCurve->create_reverse();
+ }
+ this->overwriteCurve = tmpCurve;
+}
+
+void PenTool::_bspline_spiro_start_anchor_off()
+{
+ SPCurve *tmpCurve = new SPCurve();
+ tmpCurve = this->sa->curve->copy();
+ if(this->sa->start)
+ tmpCurve = tmpCurve->create_reverse();
+ Geom::CubicBezier const * cubic = dynamic_cast<Geom::CubicBezier const*>(&*tmpCurve->last_segment());
+ if(cubic){
+ SPCurve *lastSeg = new SPCurve();
+ lastSeg->moveto((*cubic)[0]);
+ lastSeg->curveto((*cubic)[1],(*cubic)[3],(*cubic)[3]);
+ if( tmpCurve->get_segment_count() == 1){
+ tmpCurve = lastSeg;
+ }else{
+ //we eliminate the last segment
+ tmpCurve->backspace();
+ //and we add it again with the recreation
+ tmpCurve->append_continuous(lastSeg, 0.0625);
+ }
+ }
+ if (this->sa->start) {
+ tmpCurve = tmpCurve->create_reverse();
+ }
+ this->overwriteCurve = tmpCurve;
+}
+
+void PenTool::_bspline_spiro_motion(bool shift){
+ if(!this->spiro && !this->bspline)
+ return;
+
+ using Geom::X;
+ using Geom::Y;
+ if(this->red_curve->is_empty()) return;
+ this->npoints = 5;
+ SPCurve *tmpCurve = new SPCurve();
+ this->p[2] = this->p[3] + (1./3)*(this->p[0] - this->p[3]);
+ this->p[2] = Geom::Point(this->p[2][X] + handleCubicGap,this->p[2][Y] + handleCubicGap);
+ if(this->green_curve->is_empty() && !this->sa){
+ this->p[1] = this->p[0] + (1./3)*(this->p[3] - this->p[0]);
+ this->p[1] = Geom::Point(this->p[1][X] + handleCubicGap,this->p[1][Y] + handleCubicGap);
+ if(shift){
+ this->p[2] = this->p[3];
+ }
+ }else if(!this->green_curve->is_empty()){
+ tmpCurve = this->green_curve->copy();
+ }else{
+ tmpCurve = this->overwriteCurve->copy();
+ if(this->sa->start)
+ tmpCurve = tmpCurve->create_reverse();
+ }
+
+ if(!tmpCurve->is_empty()){
+ Geom::CubicBezier const * cubic = dynamic_cast<Geom::CubicBezier const*>(&*tmpCurve->last_segment());
+ if(cubic){
+ if(this->bspline){
+ SPCurve * WPower = new SPCurve();
+ Geom::D2< Geom::SBasis > SBasisWPower;
+ WPower->moveto(tmpCurve->last_segment()->finalPoint());
+ WPower->lineto(tmpCurve->last_segment()->initialPoint());
+ float WP = Geom::nearest_point((*cubic)[2],*WPower->first_segment());
+ WPower->reset();
+ WPower->moveto(this->red_curve->last_segment()->initialPoint());
+ WPower->lineto(this->red_curve->last_segment()->finalPoint());
+ SBasisWPower = WPower->first_segment()->toSBasis();
+ WPower->reset();
+ this->p[1] = SBasisWPower.valueAt(WP);
+ if(!Geom::are_near(this->p[1],this->p[0])){
+ this->p[1] = Geom::Point(this->p[1][X] + handleCubicGap,this->p[1][Y] + handleCubicGap);
+ } else {
+ this->p[1] = this->p[0];
+ }
+ if(shift)
+ this->p[2] = this->p[3];
+ }else{
+ this->p[1] = (*cubic)[3] + ((*cubic)[3] - (*cubic)[2] );
+ }
+ }else{
+ this->p[1] = this->p[0];
+ if(shift)
+ this->p[2] = this->p[3];
+ }
+ }
+
+ if(this->anchor_statusbar && !this->red_curve->is_empty()){
+ if(shift){
+ this->_bspline_spiro_end_anchor_off();
+ }else{
+ this->_bspline_spiro_end_anchor_on();
+ }
+ }
+
+ this->_bspline_spiro_build();
+}
+
+void PenTool::_bspline_spiro_end_anchor_on()
+{
+
+ using Geom::X;
+ using Geom::Y;
+ this->p[2] = this->p[3] + (1./3)*(this->p[0] - this->p[3]);
+ this->p[2] = Geom::Point(this->p[2][X] + handleCubicGap,this->p[2][Y] + handleCubicGap);
+ SPCurve *tmpCurve = new SPCurve();
+ SPCurve *lastSeg = new SPCurve();
+ Geom::Point C(0,0);
+ bool reverse = false;
+ if( this->green_anchor && this->green_anchor->active ){
+ tmpCurve = this->green_curve->create_reverse();
+ if(this->green_curve->get_segment_count()==0){
+ return;
+ }
+ reverse = true;
+ } else if(this->sa){
+ tmpCurve = this->overwriteCurve->copy();
+ if(!this->sa->start){
+ tmpCurve = tmpCurve->create_reverse();
+ reverse = true;
+ }
+ }else{
+ return;
+ }
+ Geom::CubicBezier const * cubic = dynamic_cast<Geom::CubicBezier const*>(&*tmpCurve->last_segment());
+ if(this->bspline){
+ C = tmpCurve->last_segment()->finalPoint() + (1./3)*(tmpCurve->last_segment()->initialPoint() - tmpCurve->last_segment()->finalPoint());
+ C = Geom::Point(C[X] + handleCubicGap,C[Y] + handleCubicGap);
+ }else{
+ C = this->p[3] + this->p[3] - this->p[2];
+ }
+ if(cubic){
+ lastSeg->moveto((*cubic)[0]);
+ lastSeg->curveto((*cubic)[1],C,(*cubic)[3]);
+ }else{
+ lastSeg->moveto(tmpCurve->last_segment()->initialPoint());
+ lastSeg->lineto(tmpCurve->last_segment()->finalPoint());
+ }
+ if( tmpCurve->get_segment_count() == 1){
+ tmpCurve = lastSeg;
+ }else{
+ //we eliminate the last segment
+ tmpCurve->backspace();
+ //and we add it again with the recreation
+ tmpCurve->append_continuous(lastSeg, 0.0625);
+ }
+ if (reverse) {
+ tmpCurve = tmpCurve->create_reverse();
+ }
+ if( this->green_anchor && this->green_anchor->active )
+ {
+ this->green_curve->reset();
+ this->green_curve = tmpCurve;
+ }else{
+ this->overwriteCurve->reset();
+ this->overwriteCurve = tmpCurve;
+ }
+}
+
+void PenTool::_bspline_spiro_end_anchor_off()
+{
+
+ SPCurve *tmpCurve = new SPCurve();
+ SPCurve *lastSeg = new SPCurve();
+ bool reverse = false;
+ this->p[2] = this->p[3];
+ if( this->green_anchor && this->green_anchor->active ){
+ tmpCurve = this->green_curve->create_reverse();
+ if(this->green_curve->get_segment_count()==0){
+ return;
+ }
+ reverse = true;
+ } else if(this->sa){
+ tmpCurve = this->overwriteCurve->copy();
+ if(!this->sa->start){
+ tmpCurve = tmpCurve->create_reverse();
+ reverse = true;
+ }
+ }else{
+ return;
+ }
+ Geom::CubicBezier const * cubic = dynamic_cast<Geom::CubicBezier const*>(&*tmpCurve->last_segment());
+ if(cubic){
+ lastSeg->moveto((*cubic)[0]);
+ lastSeg->curveto((*cubic)[1],(*cubic)[3],(*cubic)[3]);
+ }else{
+ lastSeg->moveto(tmpCurve->last_segment()->initialPoint());
+ lastSeg->lineto(tmpCurve->last_segment()->finalPoint());
+ }
+ if( tmpCurve->get_segment_count() == 1){
+ tmpCurve = lastSeg;
+ }else{
+ //we eliminate the last segment
+ tmpCurve->backspace();
+ //and we add it again with the recreation
+ tmpCurve->append_continuous(lastSeg, 0.0625);
+ }
+ if (reverse) {
+ tmpCurve = tmpCurve->create_reverse();
+ }
+ if( this->green_anchor && this->green_anchor->active )
+ {
+ this->green_curve->reset();
+ this->green_curve = tmpCurve;
+ }else{
+ this->overwriteCurve->reset();
+ this->overwriteCurve = tmpCurve;
+ }
+}
+
+//prepares the curves for its transformation into BSpline curve.
+void PenTool::_bspline_spiro_build()
+{
+ if(!this->spiro && !this->bspline){
+ return;
+ }
+
+ //We create the base curve
+ SPCurve *curve = new SPCurve();
+ //If we continuate the existing curve we add it at the start
+ if(this->sa && !this->sa->curve->is_empty()){
+ curve = this->overwriteCurve->copy();
+ if (this->sa->start) {
+ curve = curve->create_reverse();
+ }
+ }
+
+ if (!this->green_curve->is_empty()){
+ curve->append_continuous(this->green_curve, 0.0625);
+ }
+
+ //and the red one
+ if (!this->red_curve->is_empty()){
+ this->red_curve->reset();
+ this->red_curve->moveto(this->p[0]);
+ if(this->anchor_statusbar && !this->sa && !(this->green_anchor && this->green_anchor->active)){
+ this->red_curve->curveto(this->p[1],this->p[3],this->p[3]);
+ }else{
+ this->red_curve->curveto(this->p[1],this->p[2],this->p[3]);
+ }
+ sp_canvas_bpath_set_bpath(SP_CANVAS_BPATH(this->red_bpath), this->red_curve);
+ curve->append_continuous(this->red_curve, 0.0625);
+ }
+
+ if(!curve->is_empty()){
+ // close the curve if the final points of the curve are close enough
+ if(Geom::are_near(curve->first_path()->initialPoint(), curve->last_path()->finalPoint())){
+ curve->closepath_current();
+ }
+ //TODO: CALL TO CLONED FUNCTION SPIRO::doEffect IN lpe-spiro.cpp
+ //For example
+ //using namespace Inkscape::LivePathEffect;
+ //LivePathEffectObject *lpeobj = static_cast<LivePathEffectObject*> (curve);
+ //Effect *spr = static_cast<Effect*> ( new LPEbspline(lpeobj) );
+ //spr->doEffect(curve);
+ if(this->bspline){
+ this->_bspline_doEffect(curve);
+ }else{
+ this->_spiro_doEffect(curve);
+ }
+
+ sp_canvas_bpath_set_bpath(SP_CANVAS_BPATH(this->blue_bpath), curve);
+ sp_canvas_bpath_set_stroke(SP_CANVAS_BPATH(this->blue_bpath), this->blue_color, 1.0, SP_STROKE_LINEJOIN_MITER, SP_STROKE_LINECAP_BUTT);
+ sp_canvas_item_show(this->blue_bpath);
+ curve->unref();
+ this->blue_curve->reset();
+ //We hide the holders that doesn't contribute anything
+ if(this->spiro){
+ sp_canvas_item_show(this->c1);
+ SP_CTRL(this->c1)->moveto(this->p[0]);
+ }else
+ sp_canvas_item_hide(this->c1);
+ sp_canvas_item_hide(this->cl1);
+ sp_canvas_item_hide(this->c0);
+ sp_canvas_item_hide(this->cl0);
+ }else{
+ //if the curve is empty
+ sp_canvas_item_hide(this->blue_bpath);
+
+ }
+}
+
+void PenTool::_bspline_doEffect(SPCurve * curve)
+{
+ // commenting the function doEffect in src/live_effects/lpe-bspline.cpp
+ if (curve->get_segment_count() < 1){
+ return;
+ }
+ // Make copy of old path as it is changed during processing
+ Geom::PathVector const original_pathv = curve->get_pathvector();
+ curve->reset();
+
+ //Recorremos todos los paths a los que queremos aplicar el efecto, hasta el
+ //penúltimo
+ for (Geom::PathVector::const_iterator path_it = original_pathv.begin();
+ path_it != original_pathv.end(); ++path_it) {
+ //Si está vacío...
+ if (path_it->empty())
+ continue;
+ //Itreadores
+
+ Geom::Path::const_iterator curve_it1 = path_it->begin();
+ Geom::Path::const_iterator curve_it2 = ++(path_it->begin());
+ Geom::Path::const_iterator curve_endit = path_it->end_default();
+ SPCurve *nCurve = new SPCurve();
+ Geom::Point previousNode(0, 0);
+ Geom::Point node(0, 0);
+ Geom::Point pointAt1(0, 0);
+ Geom::Point pointAt2(0, 0);
+ Geom::Point nextPointAt1(0, 0);
+ Geom::D2<Geom::SBasis> SBasisIn;
+ Geom::D2<Geom::SBasis> SBasisOut;
+ Geom::D2<Geom::SBasis> SBasisHelper;
+ Geom::CubicBezier const *cubic = NULL;
+ if (path_it->closed()) {
+ const Geom::Curve &closingline =
+ path_it->back_closed(); // the closing line segment is always of type
+ if (are_near(closingline.initialPoint(), closingline.finalPoint())) {
+ curve_endit = path_it->end_open();
+ }
+ }
+ nCurve->moveto(curve_it1->initialPoint());
+ while (curve_it1 != curve_endit) {
+ SPCurve *in = new SPCurve();
+ in->moveto(curve_it1->initialPoint());
+ in->lineto(curve_it1->finalPoint());
+ cubic = dynamic_cast<Geom::CubicBezier const *>(&*curve_it1);
+ if (cubic) {
+ SBasisIn = in->first_segment()->toSBasis();
+ if(are_near((*cubic)[1],(*cubic)[0]) && !are_near((*cubic)[2],(*cubic)[3])) {
+ pointAt1 = SBasisIn.valueAt(0.3334);
+ } else {
+ pointAt1 = SBasisIn.valueAt(Geom::nearest_point((*cubic)[1], *in->first_segment()));
+ }
+ if(are_near((*cubic)[2],(*cubic)[3]) && !are_near((*cubic)[1],(*cubic)[0])) {
+ pointAt2 = SBasisIn.valueAt(0.6667);
+ } else {
+ pointAt2 = SBasisIn.valueAt(Geom::nearest_point((*cubic)[2], *in->first_segment()));
+ }
+ } else {
+ pointAt1 = in->first_segment()->initialPoint();
+ pointAt2 = in->first_segment()->finalPoint();
+ }
+ in->reset();
+ delete in;
+ if ( curve_it2 != curve_endit ) {
+ SPCurve *out = new SPCurve();
+ out->moveto(curve_it2->initialPoint());
+ out->lineto(curve_it2->finalPoint());
+ cubic = dynamic_cast<Geom::CubicBezier const *>(&*curve_it2);
+ if (cubic) {
+ SBasisOut = out->first_segment()->toSBasis();
+ if(are_near((*cubic)[1],(*cubic)[0]) && !are_near((*cubic)[2],(*cubic)[3])) {
+ nextPointAt1 = SBasisIn.valueAt(0.3334);
+ } else {
+ nextPointAt1 = SBasisOut.valueAt(Geom::nearest_point((*cubic)[1], *out->first_segment()));
+ }
+ } else {
+ nextPointAt1 = out->first_segment()->initialPoint();
+ }
+ out->reset();
+ delete out;
+ }
+ Geom::Point startNode = path_it->begin()->initialPoint();
+ if (path_it->closed() && curve_it2 == curve_endit) {
+ SPCurve *start = new SPCurve();
+ start->moveto(path_it->begin()->initialPoint());
+ start->lineto(path_it->begin()->finalPoint());
+ Geom::D2<Geom::SBasis> SBasisStart = start->first_segment()->toSBasis();
+ SPCurve *lineHelper = new SPCurve();
+ cubic = dynamic_cast<Geom::CubicBezier const *>(&*path_it->begin());
+ if (cubic) {
+ lineHelper->moveto(SBasisStart.valueAt(
+ Geom::nearest_point((*cubic)[1], *start->first_segment())));
+ } else {
+ lineHelper->moveto(start->first_segment()->initialPoint());
+ }
+ start->reset();
+ delete start;
+
+ SPCurve *end = new SPCurve();
+ end->moveto(curve_it1->initialPoint());
+ end->lineto(curve_it1->finalPoint());
+ Geom::D2<Geom::SBasis> SBasisEnd = end->first_segment()->toSBasis();
+ cubic = dynamic_cast<Geom::CubicBezier const *>(&*curve_it1);
+ if (cubic) {
+ lineHelper->lineto(SBasisEnd.valueAt(
+ Geom::nearest_point((*cubic)[2], *end->first_segment())));
+ } else {
+ lineHelper->lineto(end->first_segment()->finalPoint());
+ }
+ end->reset();
+ delete end;
+ SBasisHelper = lineHelper->first_segment()->toSBasis();
+ lineHelper->reset();
+ delete lineHelper;
+ startNode = SBasisHelper.valueAt(0.5);
+ nCurve->curveto(pointAt1, pointAt2, startNode);
+ nCurve->move_endpoints(startNode, startNode);
+ } else if ( curve_it2 == curve_endit) {
+ nCurve->curveto(pointAt1, pointAt2, curve_it1->finalPoint());
+ nCurve->move_endpoints(path_it->begin()->initialPoint(), curve_it1->finalPoint());
+ } else {
+ SPCurve *lineHelper = new SPCurve();
+ lineHelper->moveto(pointAt2);
+ lineHelper->lineto(nextPointAt1);
+ SBasisHelper = lineHelper->first_segment()->toSBasis();
+ lineHelper->reset();
+ delete lineHelper;
+ previousNode = node;
+ node = SBasisHelper.valueAt(0.5);
+ Geom::CubicBezier const *cubic2 = dynamic_cast<Geom::CubicBezier const *>(&*curve_it1);
+ if((cubic && are_near((*cubic)[0],(*cubic)[1])) || (cubic2 && are_near((*cubic2)[2],(*cubic2)[3]))) {
+ node = curve_it1->finalPoint();
+ }
+ nCurve->curveto(pointAt1, pointAt2, node);
+ }
+ ++curve_it1;
+ ++curve_it2;
+ }
+ if (path_it->closed()) {
+ nCurve->closepath_current();
+ }
+ curve->append(nCurve, false);
+ nCurve->reset();
+ delete nCurve;
+ }
+}
+
+//Spiro function cloned from lpe-spiro.cpp
+// commenting the function "doEffect" from src/live_effects/lpe-spiro.cpp
+void PenTool::_spiro_doEffect(SPCurve * curve)
+{
+ using Geom::X;
+ using Geom::Y;
+
+ Geom::PathVector const original_pathv = curve->get_pathvector();
+ guint len = curve->get_segment_count() + 2;
+
+ curve->reset();
+ Spiro::spiro_cp *path = g_new (Spiro::spiro_cp, len);
+ int ip = 0;
+
+ for(Geom::PathVector::const_iterator path_it = original_pathv.begin(); path_it != original_pathv.end(); ++path_it) {
+ if (path_it->empty())
+ continue;
+
+ {
+ Geom::Point p = path_it->front().pointAt(0);
+ path[ip].x = p[X];
+ path[ip].y = p[Y];
+ path[ip].ty = '{' ;
+ ip++;
+ }
+
+ Geom::Path::const_iterator curve_it1 = path_it->begin();
+ Geom::Path::const_iterator curve_it2 = ++(path_it->begin());
+
+ Geom::Path::const_iterator curve_endit = path_it->end_default();
+ if (path_it->closed()) {
+ const Geom::Curve &closingline = path_it->back_closed();
+ if (are_near(closingline.initialPoint(), closingline.finalPoint())) {
+ curve_endit = path_it->end_open();
+ }
+ }
+
+ while ( curve_it2 != curve_endit )
+ {
+ Geom::Point p = curve_it1->finalPoint();
+ path[ip].x = p[X];
+ path[ip].y = p[Y];
+
+ bool this_is_line = is_straight_curve(*curve_it1);
+ bool next_is_line = is_straight_curve(*curve_it2);
+
+ Geom::NodeType nodetype = Geom::get_nodetype(*curve_it1, *curve_it2);
+
+ if ( nodetype == Geom::NODE_SMOOTH || nodetype == Geom::NODE_SYMM )
+ {
+ if (this_is_line && !next_is_line) {
+ path[ip].ty = ']';
+ } else if (next_is_line && !this_is_line) {
+ path[ip].ty = '[';
+ } else {
+ path[ip].ty = 'c';
+ }
+ } else {
+ path[ip].ty = 'v';
+ }
+
+ ++curve_it1;
+ ++curve_it2;
+ ip++;
+ }
+
+ Geom::Point p = curve_it1->finalPoint();
+ path[ip].x = p[X];
+ path[ip].y = p[Y];
+ if (path_it->closed()) {
+ Geom::NodeType nodetype = Geom::get_nodetype(*curve_it1, path_it->front());
+ switch (nodetype) {
+ case Geom::NODE_NONE:
+ path[ip].ty = '}';
+ ip++;
+ break;
+ case Geom::NODE_CUSP:
+ path[0].ty = path[ip].ty = 'v';
+ break;
+ case Geom::NODE_SMOOTH:
+ case Geom::NODE_SYMM:
+ path[0].ty = path[ip].ty = 'c';
+ break;
+ }
+ } else {
+ path[ip].ty = '}';
+ ip++;
+ }
+
+ int sp_len = ip;
+ Spiro::spiro_run(path, sp_len, *curve);
+ ip = 0;
+ }
+
+ g_free (path);
}
void PenTool::_setSubsequentPoint(Geom::Point const p, bool statusbar, guint status) {
g_assert( this->npoints != 0 );
+
// todo: Check callers to see whether 2 <= npoints is guaranteed.
this->p[2] = p;
@@ -1195,7 +2080,7 @@ void PenTool::_setSubsequentPoint(Geom::Point const p, bool statusbar, guint sta
is_curve = false;
} else {
// one of the 'regular' modes
- if (this->p[1] != this->p[0]) {
+ if (this->p[1] != this->p[0] || this->spiro) {
this->red_curve->curveto(this->p[1], p, p);
is_curve = true;
} else {
@@ -1210,10 +2095,16 @@ void PenTool::_setSubsequentPoint(Geom::Point const p, bool statusbar, guint sta
gchar *message = is_curve ?
_("<b>Curve segment</b>: angle %3.2f&#176;, distance %s; with <b>Ctrl</b> to snap angle, <b>Enter</b> to finish the path" ):
_("<b>Line segment</b>: angle %3.2f&#176;, distance %s; with <b>Ctrl</b> to snap angle, <b>Enter</b> to finish the path");
+ if(this->spiro || this->bspline){
+ message = is_curve ?
+ _("<b>Curve segment</b>: angle %3.2f&#176;, distance %s; with <b>Shift+Click</b> make a cusp node, <b>Enter</b> to finish the path" ):
+ _("<b>Line segment</b>: angle %3.2f&#176;, distance %s; with <b>Shift+Click</b> make a cusp node, <b>Enter</b> to finish the path");
+ }
this->_setAngleDistanceStatusMessage(p, 0, message);
}
}
+
void PenTool::_setCtrl(Geom::Point const p, guint const state) {
sp_canvas_item_show(this->c1);
sp_canvas_item_show(this->cl1);
@@ -1224,7 +2115,6 @@ void PenTool::_setCtrl(Geom::Point const p, guint const state) {
sp_canvas_item_hide(this->cl0);
SP_CTRL(this->c1)->moveto(this->p[1]);
this->cl1->setCoords(this->p[0], this->p[1]);
-
this->_setAngleDistanceStatusMessage(p, 0, _("<b>Curve handle</b>: angle %3.2f&#176;, length %s; with <b>Ctrl</b> to snap angle"));
} else if ( this->npoints == 5 ) {
this->p[4] = p;
@@ -1246,6 +2136,8 @@ void PenTool::_setCtrl(Geom::Point const p, guint const state) {
SP_CTRL(this->c1)->moveto(this->p[4]);
this->cl1->setCoords(this->p[3], this->p[4]);
+
+
gchar *message = is_symm ?
_("<b>Curve handle, symmetric</b>: angle %3.2f&#176;, length %s; with <b>Ctrl</b> to snap angle, with <b>Shift</b> to move this handle only") :
_("<b>Curve handle</b>: angle %3.2f&#176;, length %s; with <b>Ctrl</b> to snap angle, with <b>Shift</b> to move this handle only");
@@ -1260,11 +2152,14 @@ void PenTool::_finishSegment(Geom::Point const p, guint const state) {
pen_last_paraxial_dir = this->nextParaxialDirection(p, this->p[0], state);
}
- ++this->num_clicks;
+ ++num_clicks;
+
if (!this->red_curve->is_empty()) {
+ this->_bspline_spiro(state & GDK_SHIFT_MASK);
this->green_curve->append_continuous(this->red_curve, 0.0625);
SPCurve *curve = this->red_curve->copy();
+
/// \todo fixme:
SPCanvasItem *cshape = sp_canvas_bpath_new(sp_desktop_sketch(this->desktop), curve);
curve->unref();
@@ -1286,15 +2181,19 @@ void PenTool::_finish(gboolean const closed) {
return;
}
+
this->num_clicks = 0;
this->_disableEvents();
this->message_context->clear();
+
desktop->messageStack()->flash(Inkscape::NORMAL_MESSAGE, _("Drawing finished"));
+ // cancelate line without a created segment
this->red_curve->reset();
spdc_concat_colors_and_flush(this, closed);
+ this->overwriteCurve = NULL;
this->sa = NULL;
this->ea = NULL;
@@ -1343,7 +2242,7 @@ int PenTool::nextParaxialDirection(Geom::Point const &pt, Geom::Point const &ori
//
// num_clicks is not reliable because spdc_pen_finish_segment is sometimes called too early
// (on first mouse release), in which case num_clicks immediately becomes 1.
- // if (pc->num_clicks == 0) {
+ // if (this->num_clicks == 0) {
if (this->green_curve->is_empty()) {
// first mouse click
diff --git a/src/ui/tools/pen-tool.h b/src/ui/tools/pen-tool.h
index 4dec7b4fe..98fd0a43e 100644
--- a/src/ui/tools/pen-tool.h
+++ b/src/ui/tools/pen-tool.h
@@ -49,6 +49,9 @@ public:
bool polylines_only;
bool polylines_paraxial;
+ // propiety which saves if Spiro mode is active or not
+ bool spiro;
+ bool bspline;
int num_clicks;
unsigned int expecting_clicks_for_LPE; // if positive, finish the path after this many clicks
@@ -85,6 +88,34 @@ private:
bool _handleButtonRelease(GdkEventButton const &revent);
bool _handle2ButtonPress(GdkEventButton const &bevent);
bool _handleKeyPress(GdkEvent *event);
+ //adds spiro & bspline modes
+ void _pen_context_set_mode(guint mode);
+ //this function changes the colors red, green and blue making them transparent or not depending on if the function uses spiro
+ void _bspline_spiro_color();
+ //creates a node in bspline or spiro modes
+ void _bspline_spiro(bool shift);
+ //creates a node in bspline or spiro modes
+ void _bspline_spiro_on();
+ //creates a CUSP node
+ void _bspline_spiro_off();
+ //continues the existing curve in bspline or spiro mode
+ void _bspline_spiro_start_anchor(bool shift);
+ //continues the existing curve with the union node in bspline or spiro modes
+ void _bspline_spiro_start_anchor_on();
+ //continues an existing curve with the union node in CUSP mode
+ void _bspline_spiro_start_anchor_off();
+ //modifies the "red_curve" when it detects movement
+ void _bspline_spiro_motion(bool shift);
+ //closes the curve with the last node in bspline or spiro mode
+ void _bspline_spiro_end_anchor_on();
+ //closes the curve with the last node in CUSP mode
+ void _bspline_spiro_end_anchor_off();
+ //CHECK: join all the curves "in game" and we call doEffect function
+ void _bspline_spiro_build();
+ //function bspline cloned from lpe-bspline.cpp
+ void _bspline_doEffect(SPCurve * curve);
+ //function spiro cloned from lpe-spiro.cpp
+ void _spiro_doEffect(SPCurve * curve);
void _setInitialPoint(Geom::Point const p);
void _setSubsequentPoint(Geom::Point const p, bool statusbar, guint status = 0);
diff --git a/src/ui/tools/pencil-tool.cpp b/src/ui/tools/pencil-tool.cpp
index fb4e82c32..3ea2ae843 100644
--- a/src/ui/tools/pencil-tool.cpp
+++ b/src/ui/tools/pencil-tool.cpp
@@ -23,7 +23,7 @@
#include "desktop-handles.h"
#include "selection.h"
#include "selection-chemistry.h"
-#include "draw-anchor.h"
+#include "ui/draw-anchor.h"
#include "message-stack.h"
#include "message-context.h"
#include "sp-path.h"
@@ -43,7 +43,7 @@
#include "display/sp-canvas.h"
#include "display/curve.h"
#include "livarot/Path.h"
-#include "tool-factory.h"
+#include "ui/tool-factory.h"
#include "ui/tool/event-utils.h"
namespace Inkscape {
@@ -200,6 +200,7 @@ bool PencilTool::_handleButtonPress(GdkEventButton const &bevent) {
}
if (anchor) {
p = anchor->dp;
+ this->overwriteCurve = anchor->curve;
desktop->messageStack()->flash(Inkscape::NORMAL_MESSAGE, _("Continuing selected path"));
} else {
m.setup(desktop);
@@ -301,7 +302,7 @@ bool PencilTool::_handleMotionNotify(GdkEventMotion const &mevent) {
if ( this->npoints != 0) { // buttonpress may have happened before we entered draw context!
if (this->ps.empty()) {
- // Only in freehand mode we have to add the first point also to pc->ps (apparently)
+ // Only in freehand mode we have to add the first point also to this->ps (apparently)
// - We cannot add this point in spdc_set_startpoint, because we only need it for freehand
// - We cannot do this in the button press handler because at that point we don't know yet
// wheter we're going into freehand mode or not
@@ -640,6 +641,9 @@ void PencilTool::_interpolate() {
return;
}
+ using Geom::X;
+ using Geom::Y;
+
Inkscape::Preferences *prefs = Inkscape::Preferences::get();
double const tol = prefs->getDoubleLimited("/tools/freehand/pencil/tolerance", 10.0, 1.0, 100.0) * 0.4;
double const tolerance_sq = 0.02 * square(this->desktop->w2d().descrim() * tol) * exp(0.2 * tol - 2);
@@ -661,10 +665,21 @@ void PencilTool::_interpolate() {
if (n_segs > 0) {
/* Fit and draw and reset state */
- this->green_curve->moveto(b[0]);
+ this->green_curve->moveto(b[0]);
+ Inkscape::Preferences *prefs = Inkscape::Preferences::get();
+ guint mode = prefs->getInt("/tools/freehand/pencil/freehand-mode", 0);
for (int c = 0; c < n_segs; c++) {
- this->green_curve->curveto(b[4 * c + 1], b[4 * c + 2], b[4 * c + 3]);
+ // if we are in BSpline we modify the trace to create adhoc nodes
+ if(mode == 2){
+ Geom::Point BP = b[4*c+0] + (1./3)*(b[4*c+3] - b[4*c+0]);
+ BP = Geom::Point(BP[X] + 0.0001,BP[Y] + 0.0001);
+ Geom::Point CP = b[4*c+3] + (1./3)*(b[4*c+0] - b[4*c+3]);
+ CP = Geom::Point(CP[X] + 0.0001,CP[Y] + 0.0001);
+ this->green_curve->curveto(BP,CP,b[4*c+3]);
+ }else{
+ this->green_curve->curveto(b[4 * c + 1], b[4 * c + 2], b[4 * c + 3]);
+ }
}
sp_canvas_bpath_set_bpath(SP_CANVAS_BPATH(this->red_bpath), this->green_curve);
@@ -788,6 +803,7 @@ void PencilTool::_fitAndSplit() {
g_assert(is_zero(this->req_tangent)
|| is_unit_vector(this->req_tangent));
Geom::Point const tHatEnd(0, 0);
+ Inkscape::Preferences *prefs = Inkscape::Preferences::get();
int const n_segs = Geom::bezier_fit_cubic_full(b, NULL, this->p, this->npoints,
this->req_tangent, tHatEnd,
tolerance_sq, 1);
@@ -795,9 +811,22 @@ void PencilTool::_fitAndSplit() {
&& unsigned(this->npoints) < G_N_ELEMENTS(this->p) )
{
/* Fit and draw and reset state */
+
this->red_curve->reset();
this->red_curve->moveto(b[0]);
- this->red_curve->curveto(b[1], b[2], b[3]);
+ using Geom::X;
+ using Geom::Y;
+ // if we are in BSpline we modify the trace to create adhoc nodes
+ guint mode = prefs->getInt("/tools/freehand/pencil/freehand-mode", 0);
+ if(mode == 2){
+ Geom::Point B = b[0] + (1./3)*(b[3] - b[0]);
+ B = Geom::Point(B[X] + 0.0001,B[Y] + 0.0001);
+ Geom::Point C = b[3] + (1./3)*(b[0] - b[3]);
+ C = Geom::Point(C[X] + 0.0001,C[Y] + 0.0001);
+ this->red_curve->curveto(B,C,b[3]);
+ }else{
+ this->red_curve->curveto(b[1], b[2], b[3]);
+ }
sp_canvas_bpath_set_bpath(SP_CANVAS_BPATH(this->red_bpath), this->red_curve);
this->red_curve_is_valid = true;
} else {
@@ -826,6 +855,13 @@ void PencilTool::_fitAndSplit() {
/// \todo fixme:
SPCanvasItem *cshape = sp_canvas_bpath_new(sp_desktop_sketch(this->desktop), curve);
curve->unref();
+
+ this->highlight_color = SP_ITEM(this->desktop->currentLayer())->highlight_color();
+ if((unsigned int)prefs->getInt("/tools/nodes/highlight_color", 0xff0000ff) == this->highlight_color){
+ this->green_color = 0x00ff007f;
+ } else {
+ this->green_color = this->highlight_color;
+ }
sp_canvas_bpath_set_stroke(SP_CANVAS_BPATH(cshape), this->green_color, 1.0, SP_STROKE_LINEJOIN_MITER, SP_STROKE_LINECAP_BUTT);
this->green_bpaths = g_slist_prepend(this->green_bpaths, cshape);
diff --git a/src/ui/tools/rect-tool.cpp b/src/ui/tools/rect-tool.cpp
index 39f422c1a..de91dcff4 100644
--- a/src/ui/tools/rect-tool.cpp
+++ b/src/ui/tools/rect-tool.cpp
@@ -40,13 +40,13 @@
#include "xml/node-event-vector.h"
#include "preferences.h"
#include "context-fns.h"
-#include "shape-editor.h"
+#include "ui/shape-editor.h"
#include "verbs.h"
#include "display/sp-canvas-item.h"
using Inkscape::DocumentUndo;
-#include "tool-factory.h"
+#include "ui/tool-factory.h"
namespace Inkscape {
namespace UI {
@@ -102,8 +102,8 @@ RectTool::~RectTool() {
* destroys old and creates new knotholder.
*/
void RectTool::selection_changed(Inkscape::Selection* selection) {
- this->shape_editor->unset_item(SH_KNOTHOLDER);
- this->shape_editor->set_item(selection->singleItem(), SH_KNOTHOLDER);
+ this->shape_editor->unset_item();
+ this->shape_editor->set_item(selection->singleItem());
}
void RectTool::setup() {
@@ -113,7 +113,7 @@ void RectTool::setup() {
SPItem *item = sp_desktop_selection(this->desktop)->singleItem();
if (item) {
- this->shape_editor->set_item(item, SH_KNOTHOLDER);
+ this->shape_editor->set_item(item);
}
this->sel_changed_connection.disconnect();
diff --git a/src/ui/tools/select-tool.cpp b/src/ui/tools/select-tool.cpp
index 21f37e83d..21459e5d0 100644
--- a/src/ui/tools/select-tool.cpp
+++ b/src/ui/tools/select-tool.cpp
@@ -41,7 +41,7 @@
#include "desktop-handles.h"
#include "sp-root.h"
#include "preferences.h"
-#include "tools-switch.h"
+#include "ui/tools-switch.h"
#include "message-stack.h"
#include "selection-describer.h"
#include "seltrans.h"
@@ -49,7 +49,7 @@
#include "display/sp-canvas.h"
#include "display/sp-canvas-item.h"
#include "display/drawing-item.h"
-#include "tool-factory.h"
+#include "ui/tool-factory.h"
using Inkscape::DocumentUndo;
diff --git a/src/ui/tools/select-tool.h b/src/ui/tools/select-tool.h
index edc4069a2..5af99a56a 100644
--- a/src/ui/tools/select-tool.h
+++ b/src/ui/tools/select-tool.h
@@ -13,7 +13,6 @@
*/
#include "ui/tools/tool-base.h"
-#include <gtk/gtk.h>
#define SP_SELECT_CONTEXT(obj) (dynamic_cast<Inkscape::UI::Tools::SelectTool*>((Inkscape::UI::Tools::ToolBase*)obj))
#define SP_IS_SELECT_CONTEXT(obj) (dynamic_cast<const Inkscape::UI::Tools::SelectTool*>((const Inkscape::UI::Tools::ToolBase*)obj) != NULL)
diff --git a/src/ui/tools/spiral-tool.cpp b/src/ui/tools/spiral-tool.cpp
index 5ae229df8..18c3e4e2d 100644
--- a/src/ui/tools/spiral-tool.cpp
+++ b/src/ui/tools/spiral-tool.cpp
@@ -39,13 +39,13 @@
#include "xml/node-event-vector.h"
#include "preferences.h"
#include "context-fns.h"
-#include "shape-editor.h"
+#include "ui/shape-editor.h"
#include "verbs.h"
#include "display/sp-canvas-item.h"
using Inkscape::DocumentUndo;
-#include "tool-factory.h"
+#include "ui/tool-factory.h"
namespace Inkscape {
namespace UI {
@@ -104,8 +104,8 @@ SpiralTool::~SpiralTool() {
* destroys old and creates new knotholder.
*/
void SpiralTool::selection_changed(Inkscape::Selection *selection) {
- this->shape_editor->unset_item(SH_KNOTHOLDER);
- this->shape_editor->set_item(selection->singleItem(), SH_KNOTHOLDER);
+ this->shape_editor->unset_item();
+ this->shape_editor->set_item(selection->singleItem());
}
void SpiralTool::setup() {
@@ -119,7 +119,7 @@ void SpiralTool::setup() {
SPItem *item = sp_desktop_selection(this->desktop)->singleItem();
if (item) {
- this->shape_editor->set_item(item, SH_KNOTHOLDER);
+ this->shape_editor->set_item(item);
}
Inkscape::Selection *selection = sp_desktop_selection(this->desktop);
diff --git a/src/ui/tools/spiral-tool.h b/src/ui/tools/spiral-tool.h
index 416aeb7e4..add92342d 100644
--- a/src/ui/tools/spiral-tool.h
+++ b/src/ui/tools/spiral-tool.h
@@ -15,17 +15,15 @@
* Released under GNU GPL
*/
-#include <gtk/gtk.h>
-#include <stddef.h>
-#include <sigc++/sigc++.h>
+#include <sigc++/connection.h>
#include <2geom/point.h>
#include "ui/tools/tool-base.h"
-#include "sp-spiral.h"
-
#define SP_SPIRAL_CONTEXT(obj) (dynamic_cast<Inkscape::UI::Tools::SpiralTool*>((Inkscape::UI::Tools::ToolBase*)obj))
#define SP_IS_SPIRAL_CONTEXT(obj) (dynamic_cast<const Inkscape::UI::Tools::SpiralTool*>((const Inkscape::UI::Tools::ToolBase*)obj) != NULL)
+class SPSpiral;
+
namespace Inkscape {
namespace UI {
namespace Tools {
diff --git a/src/ui/tools/spray-tool.cpp b/src/ui/tools/spray-tool.cpp
index e15dbb59f..cdc608558 100644
--- a/src/ui/tools/spray-tool.cpp
+++ b/src/ui/tools/spray-tool.cpp
@@ -84,7 +84,7 @@ using namespace std;
// Please enable again when working on 1.0
#define ENABLE_SPRAY_MODE_SINGLE_PATH
-#include "tool-factory.h"
+#include "ui/tool-factory.h"
namespace Inkscape {
namespace UI {
diff --git a/src/ui/tools/star-tool.cpp b/src/ui/tools/star-tool.cpp
index 68f998920..7604ba04e 100644
--- a/src/ui/tools/star-tool.cpp
+++ b/src/ui/tools/star-tool.cpp
@@ -41,7 +41,7 @@
#include "xml/repr.h"
#include "xml/node-event-vector.h"
#include "context-fns.h"
-#include "shape-editor.h"
+#include "ui/shape-editor.h"
#include "verbs.h"
#include "display/sp-canvas-item.h"
@@ -49,7 +49,7 @@
using Inkscape::DocumentUndo;
-#include "tool-factory.h"
+#include "ui/tool-factory.h"
namespace Inkscape {
namespace UI {
@@ -112,8 +112,8 @@ StarTool::~StarTool() {
void StarTool::selection_changed(Inkscape::Selection* selection) {
g_assert (selection != NULL);
- this->shape_editor->unset_item(SH_KNOTHOLDER);
- this->shape_editor->set_item(selection->singleItem(), SH_KNOTHOLDER);
+ this->shape_editor->unset_item();
+ this->shape_editor->set_item(selection->singleItem());
}
void StarTool::setup() {
@@ -129,7 +129,7 @@ void StarTool::setup() {
SPItem *item = sp_desktop_selection(this->desktop)->singleItem();
if (item) {
- this->shape_editor->set_item(item, SH_KNOTHOLDER);
+ this->shape_editor->set_item(item);
}
Inkscape::Selection *selection = sp_desktop_selection(this->desktop);
diff --git a/src/ui/tools/text-tool.cpp b/src/ui/tools/text-tool.cpp
index ac830fe6b..a72748733 100644
--- a/src/ui/tools/text-tool.cpp
+++ b/src/ui/tools/text-tool.cpp
@@ -40,7 +40,7 @@
#include "rubberband.h"
#include "selection-chemistry.h"
#include "selection.h"
-#include "shape-editor.h"
+#include "ui/shape-editor.h"
#include "sp-flowtext.h"
#include "sp-namedview.h"
#include "sp-text.h"
@@ -52,7 +52,7 @@
#include "xml/node-event-vector.h"
#include "xml/repr.h"
#include <gtk/gtk.h>
-#include "tool-factory.h"
+#include "ui/tool-factory.h"
using Inkscape::ControlManager;
using Inkscape::DocumentUndo;
@@ -177,7 +177,7 @@ void TextTool::setup() {
SPItem *item = sp_desktop_selection(this->desktop)->singleItem();
if (item && SP_IS_FLOWTEXT(item) && SP_FLOWTEXT(item)->has_internal_frame()) {
- this->shape_editor->set_item(item, SH_KNOTHOLDER);
+ this->shape_editor->set_item(item);
}
this->sel_changed_connection = sp_desktop_selection(desktop)->connectChangedFirst(
@@ -1411,10 +1411,10 @@ void TextTool::_selectionChanged(Inkscape::Selection *selection)
ToolBase *ec = SP_EVENT_CONTEXT(this);
- ec->shape_editor->unset_item(SH_KNOTHOLDER);
+ ec->shape_editor->unset_item();
SPItem *item = selection->singleItem();
if (item && SP_IS_FLOWTEXT(item) && SP_FLOWTEXT(item)->has_internal_frame()) {
- ec->shape_editor->set_item(item, SH_KNOTHOLDER);
+ ec->shape_editor->set_item(item);
}
if (this->text && (item != this->text)) {
diff --git a/src/ui/tools/text-tool.h b/src/ui/tools/text-tool.h
index ca2b3d19a..289ee180d 100644
--- a/src/ui/tools/text-tool.h
+++ b/src/ui/tools/text-tool.h
@@ -14,10 +14,7 @@
* Released under GNU GPL, read the file 'COPYING' for more information
*/
-/* #include <gdk/gdkic.h> */
-#include <stddef.h>
-#include <sigc++/sigc++.h>
-#include <gtk/gtk.h>
+#include <sigc++/connection.h>
#include "ui/tools/tool-base.h"
#include <2geom/point.h>
@@ -26,6 +23,8 @@
#define SP_TEXT_CONTEXT(obj) (dynamic_cast<Inkscape::UI::Tools::TextTool*>((Inkscape::UI::Tools::ToolBase*)obj))
#define SP_IS_TEXT_CONTEXT(obj) (dynamic_cast<const Inkscape::UI::Tools::TextTool*>((const Inkscape::UI::Tools::ToolBase*)obj) != NULL)
+typedef struct _GtkIMContext GtkIMContext;
+
struct SPCtrlLine;
namespace Inkscape {
diff --git a/src/ui/tools/tool-base.cpp b/src/ui/tools/tool-base.cpp
index 1c1e8a17a..37ca5eeea 100644
--- a/src/ui/tools/tool-base.cpp
+++ b/src/ui/tools/tool-base.cpp
@@ -44,9 +44,9 @@
#include "desktop-style.h"
#include "sp-namedview.h"
#include "selection.h"
-#include "interface.h"
+#include "ui/interface.h"
#include "macros.h"
-#include "tools-switch.h"
+#include "ui/tools-switch.h"
#include "preferences.h"
#include "message-context.h"
#include "gradient-drag.h"
@@ -55,10 +55,11 @@
#include "selcue.h"
#include "ui/tools/lpe-tool.h"
#include "ui/tool/control-point.h"
-#include "shape-editor.h"
+#include "ui/shape-editor.h"
#include "sp-guide.h"
#include "color.h"
#include "knot.h"
+#include "knot-ptr.h"
// globals for temporary switching to selector by space
static bool selector_toggled = FALSE;
@@ -1360,6 +1361,7 @@ gboolean sp_event_context_snap_watchdog_callback(gpointer data) {
break;
case DelayedSnapEvent::KNOT_HANDLER: {
gpointer knot = dse->getItem2();
+ check_if_knot_deleted(knot);
if (knot && SP_IS_KNOT(knot)) {
sp_knot_handler_request_position(dse->getEvent(), SP_KNOT(knot));
}
diff --git a/src/ui/tools/tool-base.h b/src/ui/tools/tool-base.h
index b27de9030..7a6ab83e7 100644
--- a/src/ui/tools/tool-base.h
+++ b/src/ui/tools/tool-base.h
@@ -30,7 +30,6 @@ namespace Glib {
class GrDrag;
class SPDesktop;
class SPItem;
-class ShapeEditor;
namespace Inkscape {
class MessageContext;
@@ -42,6 +41,9 @@ namespace Inkscape {
namespace Inkscape {
namespace UI {
+
+class ShapeEditor;
+
namespace Tools {
class ToolBase;
diff --git a/src/ui/tools/tweak-tool.cpp b/src/ui/tools/tweak-tool.cpp
index 571a17b70..f56975de2 100644
--- a/src/ui/tools/tweak-tool.cpp
+++ b/src/ui/tools/tweak-tool.cpp
@@ -91,7 +91,7 @@ using Inkscape::DocumentUndo;
#define DYNA_MIN_WIDTH 1.0e-6
-#include "tool-factory.h"
+#include "ui/tool-factory.h"
namespace Inkscape {
namespace UI {
diff --git a/src/ui/tools/zoom-tool.cpp b/src/ui/tools/zoom-tool.cpp
index 9f99cfe2e..b3fb78c8f 100644
--- a/src/ui/tools/zoom-tool.cpp
+++ b/src/ui/tools/zoom-tool.cpp
@@ -25,7 +25,7 @@
#include "selection-chemistry.h"
#include "ui/tools/zoom-tool.h"
-#include "tool-factory.h"
+#include "ui/tool-factory.h"
namespace Inkscape {
namespace UI {
diff --git a/src/ui/view/view-widget.cpp b/src/ui/view/view-widget.cpp
index 5cb0df215..671a4afe6 100644
--- a/src/ui/view/view-widget.cpp
+++ b/src/ui/view/view-widget.cpp
@@ -15,32 +15,9 @@
//using namespace Inkscape::UI::View;
// SPViewWidget
-
-static void sp_view_widget_class_init(SPViewWidgetClass *vwc);
-static void sp_view_widget_init(SPViewWidget *widget);
static void sp_view_widget_dispose(GObject *object);
-static GtkEventBoxClass *widget_parent_class;
-
-GType sp_view_widget_get_type(void)
-{
- static GType type = 0;
- if (!type) {
- GTypeInfo info = {
- sizeof(SPViewWidgetClass),
- NULL, NULL,
- (GClassInitFunc) sp_view_widget_class_init,
- NULL, NULL,
- sizeof(SPViewWidget),
- 0,
- (GInstanceInitFunc) sp_view_widget_init,
- NULL
- };
- type = g_type_register_static (GTK_TYPE_EVENT_BOX, "SPViewWidget", &info, (GTypeFlags)0);
- }
-
- return type;
-}
+G_DEFINE_TYPE(SPViewWidget, sp_view_widget, GTK_TYPE_EVENT_BOX);
/**
* Callback to initialize the SPViewWidget vtable.
@@ -48,8 +25,6 @@ GType sp_view_widget_get_type(void)
static void sp_view_widget_class_init(SPViewWidgetClass *vwc)
{
GObjectClass *object_class = G_OBJECT_CLASS(vwc);
-
- widget_parent_class = (GtkEventBoxClass*) g_type_class_peek_parent(vwc);
object_class->dispose = sp_view_widget_dispose;
}
@@ -77,8 +52,8 @@ static void sp_view_widget_dispose(GObject *object)
vw->view = NULL;
}
- if (((GObjectClass *) (widget_parent_class))->dispose) {
- (* ((GObjectClass *) (widget_parent_class))->dispose)(object);
+ if (G_OBJECT_CLASS(sp_view_widget_parent_class)->dispose) {
+ G_OBJECT_CLASS(sp_view_widget_parent_class)->dispose(object);
}
Inkscape::GC::request_early_collection();
diff --git a/src/ui/widget/Makefile_insert b/src/ui/widget/Makefile_insert
index 608dd5334..e18b790bd 100644
--- a/src/ui/widget/Makefile_insert
+++ b/src/ui/widget/Makefile_insert
@@ -83,5 +83,14 @@ ink_common_sources += \
ui/widget/unit-menu.cpp \
ui/widget/unit-menu.h \
ui/widget/unit-tracker.h \
- ui/widget/unit-tracker.cpp
-
+ ui/widget/unit-tracker.cpp \
+ ui/widget/clipmaskicon.cpp \
+ ui/widget/clipmaskicon.h \
+ ui/widget/highlight-picker.cpp \
+ ui/widget/highlight-picker.h \
+ ui/widget/layertypeicon.cpp \
+ ui/widget/layertypeicon.h \
+ ui/widget/insertordericon.cpp \
+ ui/widget/insertordericon.h \
+ ui/widget/addtoicon.cpp \
+ ui/widget/addtoicon.h
diff --git a/src/ui/widget/addtoicon.cpp b/src/ui/widget/addtoicon.cpp
new file mode 100644
index 000000000..ce665295b
--- /dev/null
+++ b/src/ui/widget/addtoicon.cpp
@@ -0,0 +1,157 @@
+/*
+ * Authors:
+ * Theodore Janeczko
+ *
+ * Copyright (C) Theodore Janeczko 2012 <flutterguy317@gmail.com>
+ *
+ * Released under GNU GPL, read the file 'COPYING' for more information
+ */
+
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#if GLIBMM_DISABLE_DEPRECATED && HAVE_GLIBMM_THREADS_H
+# include <glibmm/threads.h>
+#endif
+
+#include "ui/widget/addtoicon.h"
+
+#include <gtkmm/icontheme.h>
+
+#include "widgets/icon.h"
+#include "widgets/toolbox.h"
+#include "ui/icon-names.h"
+#include "layertypeicon.h"
+#include "addtoicon.h"
+
+namespace Inkscape {
+namespace UI {
+namespace Widget {
+
+AddToIcon::AddToIcon() :
+ Glib::ObjectBase(typeid(AddToIcon)),
+ Gtk::CellRendererPixbuf(),
+// _pixAddName(INKSCAPE_ICON("layer-new")),
+ _property_active(*this, "active", false)
+// _property_pixbuf_add(*this, "pixbuf_on", Glib::RefPtr<Gdk::Pixbuf>(0))
+{
+ property_mode() = Gtk::CELL_RENDERER_MODE_ACTIVATABLE;
+ phys = sp_icon_get_phys_size((int)Inkscape::ICON_SIZE_BUTTON);
+// Glib::RefPtr<Gtk::IconTheme> icon_theme = Gtk::IconTheme::get_default();
+//
+// if (!icon_theme->has_icon(_pixAddName)) {
+// Inkscape::queueIconPrerender( INKSCAPE_ICON(_pixAddName.data()), Inkscape::ICON_SIZE_DECORATION );
+// }
+// if (icon_theme->has_icon(_pixAddName)) {
+// _property_pixbuf_add = icon_theme->load_icon(_pixAddName, phys, (Gtk::IconLookupFlags)0);
+// }
+//
+// _property_pixbuf_add = Gtk::Widget::
+
+ property_stock_id() = GTK_STOCK_ADD;
+}
+
+
+#if WITH_GTKMM_3_0
+void AddToIcon::get_preferred_height_vfunc(Gtk::Widget& widget,
+ int& min_h,
+ int& nat_h) const
+{
+ Gtk::CellRendererPixbuf::get_preferred_height_vfunc(widget, min_h, nat_h);
+
+ if (min_h) {
+ min_h += (min_h) >> 1;
+ }
+
+ if (nat_h) {
+ nat_h += (nat_h) >> 1;
+ }
+}
+
+void AddToIcon::get_preferred_width_vfunc(Gtk::Widget& widget,
+ int& min_w,
+ int& nat_w) const
+{
+ Gtk::CellRendererPixbuf::get_preferred_width_vfunc(widget, min_w, nat_w);
+
+ if (min_w) {
+ min_w += (min_w) >> 1;
+ }
+
+ if (nat_w) {
+ nat_w += (nat_w) >> 1;
+ }
+}
+#else
+void AddToIcon::get_size_vfunc(Gtk::Widget& widget,
+ const Gdk::Rectangle* cell_area,
+ int* x_offset,
+ int* y_offset,
+ int* width,
+ int* height ) const
+{
+ Gtk::CellRendererPixbuf::get_size_vfunc( widget, cell_area, x_offset, y_offset, width, height );
+
+ if ( width ) {
+ *width = phys;//+= (*width) >> 1;
+ }
+ if ( height ) {
+ *height =phys;//+= (*height) >> 1;
+ }
+}
+#endif
+
+#if WITH_GTKMM_3_0
+void AddToIcon::render_vfunc( const Cairo::RefPtr<Cairo::Context>& cr,
+ Gtk::Widget& widget,
+ const Gdk::Rectangle& background_area,
+ const Gdk::Rectangle& cell_area,
+ Gtk::CellRendererState flags )
+#else
+void AddToIcon::render_vfunc( const Glib::RefPtr<Gdk::Drawable>& window,
+ Gtk::Widget& widget,
+ const Gdk::Rectangle& background_area,
+ const Gdk::Rectangle& cell_area,
+ const Gdk::Rectangle& expose_area,
+ Gtk::CellRendererState flags )
+#endif
+{
+ property_stock_id() = property_active().get_value() ? GTK_STOCK_ADD : GTK_STOCK_DELETE;
+
+#if WITH_GTKMM_3_0
+ Gtk::CellRendererPixbuf::render_vfunc( cr, widget, background_area, cell_area, flags );
+#else
+ Gtk::CellRendererPixbuf::render_vfunc( window, widget, background_area, cell_area, expose_area, flags );
+#endif
+}
+
+bool
+AddToIcon::activate_vfunc(GdkEvent* event,
+ Gtk::Widget& /*widget*/,
+ const Glib::ustring& path,
+ const Gdk::Rectangle& /*background_area*/,
+ const Gdk::Rectangle& /*cell_area*/,
+ Gtk::CellRendererState /*flags*/)
+{
+ return false;
+}
+
+
+} // namespace Widget
+} // namespace UI
+} // namespace Inkscape
+
+/*
+ Local Variables:
+ mode:c++
+ c-file-style:"stroustrup"
+ c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
+ indent-tabs-mode:nil
+ fill-column:99
+ End:
+*/
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :
+
+
diff --git a/src/ui/widget/addtoicon.h b/src/ui/widget/addtoicon.h
new file mode 100644
index 000000000..9c134d231
--- /dev/null
+++ b/src/ui/widget/addtoicon.h
@@ -0,0 +1,98 @@
+#ifndef __UI_DIALOG_ADDTOICON_H__
+#define __UI_DIALOG_ADDTOICON_H__
+/*
+ * Authors:
+ * Theodore Janeczko
+ *
+ * Copyright (C) Theodore Janeczko 2012 <flutterguy317@gmail.com>
+ *
+ * Released under GNU GPL, read the file 'COPYING' for more information
+ */
+
+#if HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <gtkmm/cellrendererpixbuf.h>
+#include <gtkmm/widget.h>
+#include <glibmm/property.h>
+
+namespace Inkscape {
+namespace UI {
+namespace Widget {
+
+class AddToIcon : public Gtk::CellRendererPixbuf {
+public:
+ AddToIcon();
+ virtual ~AddToIcon() {};
+
+ Glib::PropertyProxy<bool> property_active() { return _property_active.get_proxy(); }
+ Glib::PropertyProxy< Glib::RefPtr<Gdk::Pixbuf> > property_pixbuf_on();
+ Glib::PropertyProxy< Glib::RefPtr<Gdk::Pixbuf> > property_pixbuf_off();
+
+protected:
+
+#if WITH_GTKMM_3_0
+ virtual void render_vfunc( const Cairo::RefPtr<Cairo::Context>& cr,
+ Gtk::Widget& widget,
+ const Gdk::Rectangle& background_area,
+ const Gdk::Rectangle& cell_area,
+ Gtk::CellRendererState flags );
+
+ virtual void get_preferred_width_vfunc(Gtk::Widget& widget,
+ int& min_w,
+ int& nat_w) const;
+
+ virtual void get_preferred_height_vfunc(Gtk::Widget& widget,
+ int& min_h,
+ int& nat_h) const;
+#else
+ virtual void render_vfunc( const Glib::RefPtr<Gdk::Drawable>& window,
+ Gtk::Widget& widget,
+ const Gdk::Rectangle& background_area,
+ const Gdk::Rectangle& cell_area,
+ const Gdk::Rectangle& expose_area,
+ Gtk::CellRendererState flags );
+
+ virtual void get_size_vfunc( Gtk::Widget &widget,
+ Gdk::Rectangle const *cell_area,
+ int *x_offset, int *y_offset, int *width, int *height ) const;
+#endif
+
+ virtual bool activate_vfunc(GdkEvent *event,
+ Gtk::Widget &widget,
+ const Glib::ustring &path,
+ const Gdk::Rectangle &background_area,
+ const Gdk::Rectangle &cell_area,
+ Gtk::CellRendererState flags);
+
+
+private:
+ int phys;
+
+// Glib::ustring _pixAddName;
+
+ Glib::Property<bool> _property_active;
+// Glib::Property< Glib::RefPtr<Gdk::Pixbuf> > _property_pixbuf_add;
+
+};
+
+
+
+} // namespace Widget
+} // namespace UI
+} // namespace Inkscape
+
+
+#endif /* __UI_DIALOG_IMAGETOGGLER_H__ */
+
+/*
+ Local Variables:
+ mode:c++
+ c-file-style:"stroustrup"
+ c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
+ indent-tabs-mode:nil
+ fill-column:99
+ End:
+*/
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :
diff --git a/src/ui/widget/anchor-selector.cpp b/src/ui/widget/anchor-selector.cpp
index 82e27ee89..df00b786a 100644
--- a/src/ui/widget/anchor-selector.cpp
+++ b/src/ui/widget/anchor-selector.cpp
@@ -28,7 +28,11 @@ void AnchorSelector::setupButton(const Glib::ustring& icon, Gtk::ToggleButton& b
AnchorSelector::AnchorSelector()
: Gtk::Alignment(0.5, 0, 0, 0),
+#if WITH_GTKMM_3_0
+ _container()
+#else
_container(3, 3, true)
+#endif
{
setupButton(INKSCAPE_ICON("boundingbox_top_left"), _buttons[0]);
setupButton(INKSCAPE_ICON("boundingbox_top"), _buttons[1]);
@@ -40,10 +44,20 @@ AnchorSelector::AnchorSelector()
setupButton(INKSCAPE_ICON("boundingbox_bottom"), _buttons[7]);
setupButton(INKSCAPE_ICON("boundingbox_bottom_right"), _buttons[8]);
+#if WITH_GTKMM_3_0
+ _container.set_row_homogeneous();
+ _container.set_column_homogeneous(true);
+#endif
+
for(int i = 0; i < 9; ++i) {
_buttons[i].signal_clicked().connect(
sigc::bind(sigc::mem_fun(*this, &AnchorSelector::btn_activated), i));
+
+#if WITH_GTKMM_3_0
+ _container.attach(_buttons[i], i % 3, i / 3, 1, 1);
+#else
_container.attach(_buttons[i], i % 3, i % 3+1, i / 3, i / 3+1, Gtk::FILL, Gtk::FILL);
+#endif
}
_selection = 4;
_buttons[4].set_active();
@@ -94,4 +108,4 @@ void AnchorSelector::setAlignment(int horizontal, int vertical)
fill-column:99
End:
*/
-// vim: filetype=c++:expandtab:shiftwidth=4:tabstop=8:softtabstop=4 :
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4 :
diff --git a/src/ui/widget/anchor-selector.h b/src/ui/widget/anchor-selector.h
index 2263438e3..0a702d296 100644
--- a/src/ui/widget/anchor-selector.h
+++ b/src/ui/widget/anchor-selector.h
@@ -10,7 +10,18 @@
#ifndef ANCHOR_SELECTOR_H_
#define ANCHOR_SELECTOR_H_
-#include <gtkmm.h>
+#if HAVE_CONFIG_H
+ #include "config.h"
+#endif
+
+#include <gtkmm/alignment.h>
+#include <gtkmm/togglebutton.h>
+
+#if WITH_GTKMM_3_0
+ #include <gtkmm/grid.h>
+#else
+ #include <gtkmm/table.h>
+#endif
namespace Inkscape {
namespace UI {
@@ -21,7 +32,12 @@ class AnchorSelector : public Gtk::Alignment
private:
Gtk::ToggleButton _buttons[9];
int _selection;
+
+#if WITH_GTKMM_3_0
+ Gtk::Grid _container;
+#else
Gtk::Table _container;
+#endif
sigc::signal<void> _selectionChanged;
@@ -56,4 +72,4 @@ public:
fill-column:99
End:
*/
-// vim: filetype=c++:expandtab:shiftwidth=4:tabstop=8:softtabstop=4 :
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4 :
diff --git a/src/ui/widget/button.cpp b/src/ui/widget/button.cpp
index bac866920..6c2d419cf 100644
--- a/src/ui/widget/button.cpp
+++ b/src/ui/widget/button.cpp
@@ -51,13 +51,13 @@ RadioButton::RadioButton(Glib::ustring const &label, Glib::ustring const &toolti
} // namespace UI
} // namespace Inkscape
-/*
+/*
Local Variables:
mode:c++
c-file-style:"stroustrup"
- c-file-offsets:((innamespace . 0)(inline-open . 0))
+ c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
indent-tabs-mode:nil
fill-column:99
End:
*/
-// vim: filetype=c++:expandtab:shiftwidth=4:tabstop=8:softtabstop=4 :
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :
diff --git a/src/ui/widget/button.h b/src/ui/widget/button.h
index a214dd881..471b7d8a2 100644
--- a/src/ui/widget/button.h
+++ b/src/ui/widget/button.h
@@ -67,13 +67,13 @@ public:
#endif // INKSCAPE_UI_WIDGET_BUTTON_H
-/*
+/*
Local Variables:
mode:c++
c-file-style:"stroustrup"
- c-file-offsets:((innamespace . 0)(inline-open . 0))
+ c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
indent-tabs-mode:nil
fill-column:99
End:
*/
-// vim: filetype=c++:expandtab:shiftwidth=4:tabstop=8:softtabstop=4 :
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :
diff --git a/src/ui/widget/clipmaskicon.cpp b/src/ui/widget/clipmaskicon.cpp
new file mode 100644
index 000000000..6331d70d8
--- /dev/null
+++ b/src/ui/widget/clipmaskicon.cpp
@@ -0,0 +1,184 @@
+/*
+ * Authors:
+ * Theodore Janeczko
+ *
+ * Copyright (C) Theodore Janeczko 2012 <flutterguy317@gmail.com>
+ *
+ * Released under GNU GPL, read the file 'COPYING' for more information
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#if GLIBMM_DISABLE_DEPRECATED && HAVE_GLIBMM_THREADS_H
+# include <glibmm/threads.h>
+#endif
+
+#include "ui/widget/clipmaskicon.h"
+
+#include <gtkmm/icontheme.h>
+
+#include "widgets/icon.h"
+#include "widgets/toolbox.h"
+#include "ui/icon-names.h"
+#include "layertypeicon.h"
+
+namespace Inkscape {
+namespace UI {
+namespace Widget {
+
+ClipMaskIcon::ClipMaskIcon() :
+ Glib::ObjectBase(typeid(ClipMaskIcon)),
+ Gtk::CellRendererPixbuf(),
+ _pixClipName(INKSCAPE_ICON("path-intersection")),
+ _pixInverseName(INKSCAPE_ICON("path-difference")),
+ _pixMaskName(INKSCAPE_ICON("mask-intersection")),
+ _property_active(*this, "active", 0),
+ _property_pixbuf_clip(*this, "pixbuf_on", Glib::RefPtr<Gdk::Pixbuf>(0)),
+ _property_pixbuf_inverse(*this, "pixbuf_on", Glib::RefPtr<Gdk::Pixbuf>(0)),
+ _property_pixbuf_mask(*this, "pixbuf_off", Glib::RefPtr<Gdk::Pixbuf>(0))
+{
+
+ property_mode() = Gtk::CELL_RENDERER_MODE_ACTIVATABLE;
+ phys = sp_icon_get_phys_size((int)Inkscape::ICON_SIZE_DECORATION);
+ Glib::RefPtr<Gtk::IconTheme> icon_theme = Gtk::IconTheme::get_default();
+
+ if (!icon_theme->has_icon(_pixClipName)) {
+ Inkscape::queueIconPrerender( INKSCAPE_ICON(_pixClipName.data()), Inkscape::ICON_SIZE_DECORATION );
+ }
+ if (!icon_theme->has_icon(_pixInverseName)) {
+ Inkscape::queueIconPrerender( INKSCAPE_ICON(_pixInverseName.data()), Inkscape::ICON_SIZE_DECORATION );
+ }
+ if (!icon_theme->has_icon(_pixMaskName)) {
+ Inkscape::queueIconPrerender( INKSCAPE_ICON(_pixMaskName.data()), Inkscape::ICON_SIZE_DECORATION );
+ }
+
+ if (icon_theme->has_icon(_pixClipName)) {
+ _property_pixbuf_clip = icon_theme->load_icon(_pixClipName, phys, (Gtk::IconLookupFlags)0);
+ }
+ if (icon_theme->has_icon(_pixInverseName)) {
+ _property_pixbuf_inverse = icon_theme->load_icon(_pixInverseName, phys, (Gtk::IconLookupFlags)0);
+ }
+ if (icon_theme->has_icon(_pixMaskName)) {
+ _property_pixbuf_mask = icon_theme->load_icon(_pixMaskName, phys, (Gtk::IconLookupFlags)0);
+ }
+
+ property_pixbuf() = Glib::RefPtr<Gdk::Pixbuf>(0);
+}
+
+
+#if WITH_GTKMM_3_0
+void ClipMaskIcon::get_preferred_height_vfunc(Gtk::Widget& widget,
+ int& min_h,
+ int& nat_h) const
+{
+ Gtk::CellRendererPixbuf::get_preferred_height_vfunc(widget, min_h, nat_h);
+
+ if (min_h) {
+ min_h += (min_h) >> 1;
+ }
+
+ if (nat_h) {
+ nat_h += (nat_h) >> 1;
+ }
+}
+
+void ClipMaskIcon::get_preferred_width_vfunc(Gtk::Widget& widget,
+ int& min_w,
+ int& nat_w) const
+{
+ Gtk::CellRendererPixbuf::get_preferred_width_vfunc(widget, min_w, nat_w);
+
+ if (min_w) {
+ min_w += (min_w) >> 1;
+ }
+
+ if (nat_w) {
+ nat_w += (nat_w) >> 1;
+ }
+}
+#else
+void ClipMaskIcon::get_size_vfunc(Gtk::Widget& widget,
+ const Gdk::Rectangle* cell_area,
+ int* x_offset,
+ int* y_offset,
+ int* width,
+ int* height ) const
+{
+ Gtk::CellRendererPixbuf::get_size_vfunc( widget, cell_area, x_offset, y_offset, width, height );
+
+ if ( width ) {
+ *width = phys;//+= (*width) >> 1;
+ }
+ if ( height ) {
+ *height =phys;//+= (*height) >> 1;
+ }
+}
+#endif
+
+#if WITH_GTKMM_3_0
+void ClipMaskIcon::render_vfunc( const Cairo::RefPtr<Cairo::Context>& cr,
+ Gtk::Widget& widget,
+ const Gdk::Rectangle& background_area,
+ const Gdk::Rectangle& cell_area,
+ Gtk::CellRendererState flags )
+#else
+void ClipMaskIcon::render_vfunc( const Glib::RefPtr<Gdk::Drawable>& window,
+ Gtk::Widget& widget,
+ const Gdk::Rectangle& background_area,
+ const Gdk::Rectangle& cell_area,
+ const Gdk::Rectangle& expose_area,
+ Gtk::CellRendererState flags )
+#endif
+{
+ switch (_property_active.get_value())
+ {
+ case 1:
+ property_pixbuf() = _property_pixbuf_clip;
+ break;
+ case 2:
+ property_pixbuf() = _property_pixbuf_mask;
+ break;
+ case 3:
+ property_pixbuf() = _property_pixbuf_inverse;
+ break;
+ default:
+ property_pixbuf() = Glib::RefPtr<Gdk::Pixbuf>(0);
+ break;
+ }
+#if WITH_GTKMM_3_0
+ Gtk::CellRendererPixbuf::render_vfunc( cr, widget, background_area, cell_area, flags );
+#else
+ Gtk::CellRendererPixbuf::render_vfunc( window, widget, background_area, cell_area, expose_area, flags );
+#endif
+}
+
+bool
+ClipMaskIcon::activate_vfunc(GdkEvent* event,
+ Gtk::Widget& /*widget*/,
+ const Glib::ustring& path,
+ const Gdk::Rectangle& /*background_area*/,
+ const Gdk::Rectangle& /*cell_area*/,
+ Gtk::CellRendererState /*flags*/)
+{
+ return false;
+}
+
+
+} // namespace Widget
+} // namespace UI
+} // namespace Inkscape
+
+/*
+ Local Variables:
+ mode:c++
+ c-file-style:"stroustrup"
+ c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
+ indent-tabs-mode:nil
+ fill-column:99
+ End:
+*/
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :
+
+
diff --git a/src/ui/widget/clipmaskicon.h b/src/ui/widget/clipmaskicon.h
new file mode 100644
index 000000000..eca852a83
--- /dev/null
+++ b/src/ui/widget/clipmaskicon.h
@@ -0,0 +1,102 @@
+#ifndef __UI_DIALOG_CLIPMASKICON_H__
+#define __UI_DIALOG_CLIPMASKICON_H__
+/*
+ * Authors:
+ * Theodore Janeczko
+ *
+ * Copyright (C) Theodore Janeczko 2012 <flutterguy317@gmail.com>
+ *
+ * Released under GNU GPL, read the file 'COPYING' for more information
+ */
+
+#if HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <gtkmm/cellrendererpixbuf.h>
+#include <gtkmm/widget.h>
+#include <glibmm/property.h>
+
+namespace Inkscape {
+namespace UI {
+namespace Widget {
+
+class ClipMaskIcon : public Gtk::CellRendererPixbuf {
+public:
+ ClipMaskIcon();
+ virtual ~ClipMaskIcon() {};
+
+ Glib::PropertyProxy<int> property_active() { return _property_active.get_proxy(); }
+ Glib::PropertyProxy< Glib::RefPtr<Gdk::Pixbuf> > property_pixbuf_on();
+ Glib::PropertyProxy< Glib::RefPtr<Gdk::Pixbuf> > property_pixbuf_off();
+
+protected:
+
+#if WITH_GTKMM_3_0
+ virtual void render_vfunc( const Cairo::RefPtr<Cairo::Context>& cr,
+ Gtk::Widget& widget,
+ const Gdk::Rectangle& background_area,
+ const Gdk::Rectangle& cell_area,
+ Gtk::CellRendererState flags );
+
+ virtual void get_preferred_width_vfunc(Gtk::Widget& widget,
+ int& min_w,
+ int& nat_w) const;
+
+ virtual void get_preferred_height_vfunc(Gtk::Widget& widget,
+ int& min_h,
+ int& nat_h) const;
+#else
+ virtual void render_vfunc( const Glib::RefPtr<Gdk::Drawable>& window,
+ Gtk::Widget& widget,
+ const Gdk::Rectangle& background_area,
+ const Gdk::Rectangle& cell_area,
+ const Gdk::Rectangle& expose_area,
+ Gtk::CellRendererState flags );
+
+ virtual void get_size_vfunc( Gtk::Widget &widget,
+ Gdk::Rectangle const *cell_area,
+ int *x_offset, int *y_offset, int *width, int *height ) const;
+#endif
+
+ virtual bool activate_vfunc(GdkEvent *event,
+ Gtk::Widget &widget,
+ const Glib::ustring &path,
+ const Gdk::Rectangle &background_area,
+ const Gdk::Rectangle &cell_area,
+ Gtk::CellRendererState flags);
+
+
+private:
+ int phys;
+
+ Glib::ustring _pixClipName;
+ Glib::ustring _pixInverseName;
+ Glib::ustring _pixMaskName;
+
+ Glib::Property<int> _property_active;
+ Glib::Property< Glib::RefPtr<Gdk::Pixbuf> > _property_pixbuf_clip;
+ Glib::Property< Glib::RefPtr<Gdk::Pixbuf> > _property_pixbuf_inverse;
+ Glib::Property< Glib::RefPtr<Gdk::Pixbuf> > _property_pixbuf_mask;
+
+};
+
+
+
+} // namespace Widget
+} // namespace UI
+} // namespace Inkscape
+
+
+#endif /* __UI_DIALOG_IMAGETOGGLER_H__ */
+
+/*
+ Local Variables:
+ mode:c++
+ c-file-style:"stroustrup"
+ c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
+ indent-tabs-mode:nil
+ fill-column:99
+ End:
+*/
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :
diff --git a/src/ui/widget/color-picker.cpp b/src/ui/widget/color-picker.cpp
index 5585f2db4..6b5a351f6 100644
--- a/src/ui/widget/color-picker.cpp
+++ b/src/ui/widget/color-picker.cpp
@@ -15,7 +15,7 @@
#include "desktop-handles.h"
#include "document.h"
#include "document-undo.h"
-#include "dialogs/dialog-events.h"
+#include "ui/dialog-events.h"
#include "widgets/sp-color-notebook.h"
#include "verbs.h"
diff --git a/src/ui/widget/entity-entry.cpp b/src/ui/widget/entity-entry.cpp
index 0f526f77a..c7d5efe29 100644
--- a/src/ui/widget/entity-entry.cpp
+++ b/src/ui/widget/entity-entry.cpp
@@ -206,9 +206,9 @@ EntityMultiLineEntry::on_changed()
Local Variables:
mode:c++
c-file-style:"stroustrup"
- c-file-offsets:((innamespace . 0)(inline-open . 0))
+ c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
indent-tabs-mode:nil
fill-column:99
End:
*/
-// vim: filetype=c++:expandtab:shiftwidth=4:tabstop=8:softtabstop=4 :
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :
diff --git a/src/ui/widget/entity-entry.h b/src/ui/widget/entity-entry.h
index 09289496d..35f6ecfb4 100644
--- a/src/ui/widget/entity-entry.h
+++ b/src/ui/widget/entity-entry.h
@@ -76,9 +76,9 @@ protected:
Local Variables:
mode:c++
c-file-style:"stroustrup"
- c-file-offsets:((innamespace . 0)(inline-open . 0))
+ c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
indent-tabs-mode:nil
fill-column:99
End:
*/
-// vim: filetype=c++:expandtab:shiftwidth=4:tabstop=8:softtabstop=4 :
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :
diff --git a/src/ui/widget/filter-effect-chooser.cpp b/src/ui/widget/filter-effect-chooser.cpp
index 78988a041..4754b9c23 100644
--- a/src/ui/widget/filter-effect-chooser.cpp
+++ b/src/ui/widget/filter-effect-chooser.cpp
@@ -23,6 +23,8 @@ namespace Widget {
SimpleFilterModifier::SimpleFilterModifier(int flags)
: _lb_blend(_("Blend mode:")),
+ _lb_blur(_("_Blur:")),
+ _lb_blur_unit(_("%")),
_blend(BlendModeConverter, SP_ATTR_INVALID, false),
_blur(_("Blur (%)"), 0, 0, 100, 1, 0.01, 1)
{
diff --git a/src/ui/widget/filter-effect-chooser.h b/src/ui/widget/filter-effect-chooser.h
index 8d2389b15..6092c61a5 100644
--- a/src/ui/widget/filter-effect-chooser.h
+++ b/src/ui/widget/filter-effect-chooser.h
@@ -53,11 +53,13 @@ public:
double get_blur_value() const;
void set_blur_value(const double);
void set_blur_sensitive(const bool);
+ Gtk::Label *get_blur_label() { return &_lb_blur; };
private:
int _flags;
Gtk::HBox _hb_blend;
- Gtk::Label _lb_blend;
+ Gtk::HBox _hb_blur;
+ Gtk::Label _lb_blend, _lb_blur, _lb_blur_unit;
ComboBoxEnum<Inkscape::Filters::FilterBlendMode> _blend;
SpinScale _blur;
diff --git a/src/ui/widget/highlight-picker.cpp b/src/ui/widget/highlight-picker.cpp
new file mode 100644
index 000000000..8593f0bdf
--- /dev/null
+++ b/src/ui/widget/highlight-picker.cpp
@@ -0,0 +1,207 @@
+/*
+ * Authors:
+ * Theodore Janeczko
+ *
+ * Copyright (C) Theodore Janeczko 2012 <flutterguy317@gmail.com>
+ *
+ * Released under GNU GPL, read the file 'COPYING' for more information
+ */
+
+#include <glibmm.h>
+#include <gtkmm/icontheme.h>
+
+#include "display/cairo-utils.h"
+
+#include "highlight-picker.h"
+#include "widgets/icon.h"
+#include "widgets/toolbox.h"
+#include "ui/icon-names.h"
+#include <glibmm/i18n.h>
+
+namespace Inkscape {
+namespace UI {
+namespace Widget {
+
+HighlightPicker::HighlightPicker() :
+ Glib::ObjectBase(typeid(HighlightPicker)),
+ Gtk::CellRendererPixbuf(),
+ _property_active(*this, "active", 0)
+{
+
+ property_mode() = Gtk::CELL_RENDERER_MODE_ACTIVATABLE;
+}
+
+HighlightPicker::~HighlightPicker()
+{
+}
+
+
+#if WITH_GTKMM_3_0
+void HighlightPicker::get_preferred_height_vfunc(Gtk::Widget& widget,
+ int& min_h,
+ int& nat_h) const
+{
+ Gtk::CellRendererPixbuf::get_preferred_height_vfunc(widget, min_h, nat_h);
+
+ if (min_h) {
+ min_h += (min_h) >> 1;
+ }
+
+ if (nat_h) {
+ nat_h += (nat_h) >> 1;
+ }
+}
+
+void HighlightPicker::get_preferred_width_vfunc(Gtk::Widget& widget,
+ int& min_w,
+ int& nat_w) const
+{
+ Gtk::CellRendererPixbuf::get_preferred_width_vfunc(widget, min_w, nat_w);
+
+ if (min_w) {
+ min_w += (min_w) >> 1;
+ }
+
+ if (nat_w) {
+ nat_w += (nat_w) >> 1;
+ }
+}
+#else
+void HighlightPicker::get_size_vfunc(Gtk::Widget& widget,
+ const Gdk::Rectangle* cell_area,
+ int* x_offset,
+ int* y_offset,
+ int* width,
+ int* height ) const
+{
+ Gtk::CellRendererPixbuf::get_size_vfunc( widget, cell_area, x_offset, y_offset, width, height );
+
+ if ( width ) {
+ *width = 10;//+= (*width) >> 1;
+ }
+ if ( height ) {
+ *height = 20; //cell_area ? cell_area->get_height() / 2 : 50; //+= (*height) >> 1;
+ }
+}
+#endif
+
+#if WITH_GTKMM_3_0
+void HighlightPicker::render_vfunc( const Cairo::RefPtr<Cairo::Context>& cr,
+ Gtk::Widget& widget,
+ const Gdk::Rectangle& background_area,
+ const Gdk::Rectangle& cell_area,
+ Gtk::CellRendererState flags )
+#else
+void HighlightPicker::render_vfunc( const Glib::RefPtr<Gdk::Drawable>& window,
+ Gtk::Widget& widget,
+ const Gdk::Rectangle& background_area,
+ const Gdk::Rectangle& cell_area,
+ const Gdk::Rectangle& expose_area,
+ Gtk::CellRendererState flags )
+#endif
+{
+ GdkRectangle carea;
+
+ cairo_surface_t *s = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, 10, 20);
+ cairo_t *ct = cairo_create(s);
+
+ /* Transparent area */
+ carea.x = 0;
+ carea.y = 0;
+ carea.width = 10;
+ carea.height = 20;
+
+ cairo_pattern_t *checkers = ink_cairo_pattern_create_checkerboard();
+
+ cairo_rectangle(ct, carea.x, carea.y, carea.width, carea.height / 2);
+ cairo_set_source(ct, checkers);
+ cairo_fill_preserve(ct);
+ ink_cairo_set_source_rgba32(ct, _property_active.get_value());
+ cairo_fill(ct);
+
+ cairo_pattern_destroy(checkers);
+
+ cairo_rectangle(ct, carea.x, carea.y + carea.height / 2, carea.width, carea.height / 2);
+ ink_cairo_set_source_rgba32(ct, _property_active.get_value() | 0x000000ff);
+ cairo_fill(ct);
+
+ cairo_rectangle(ct, carea.x, carea.y, carea.width, carea.height);
+ ink_cairo_set_source_rgba32(ct, 0x333333ff);
+ cairo_set_line_width(ct, 2);
+ cairo_stroke(ct);
+
+ cairo_destroy(ct);
+ cairo_surface_flush(s);
+
+ GdkPixbuf* pixbuf = gdk_pixbuf_new_from_data( cairo_image_surface_get_data(s),
+ GDK_COLORSPACE_RGB, TRUE, 8,
+ 10, 20, cairo_image_surface_get_stride(s),
+ ink_cairo_pixbuf_cleanup, s);
+ convert_pixbuf_argb32_to_normal(pixbuf);
+
+ property_pixbuf() = Glib::wrap(pixbuf);
+#if WITH_GTKMM_3_0
+ Gtk::CellRendererPixbuf::render_vfunc( cr, widget, background_area, cell_area, flags );
+#else
+ Gtk::CellRendererPixbuf::render_vfunc( window, widget, background_area, cell_area, expose_area, flags );
+#endif
+}
+
+bool
+HighlightPicker::activate_vfunc(GdkEvent* event,
+ Gtk::Widget& /*widget*/,
+ const Glib::ustring& path,
+ const Gdk::Rectangle& /*background_area*/,
+ const Gdk::Rectangle& /*cell_area*/,
+ Gtk::CellRendererState /*flags*/)
+{
+ return false;
+}
+
+} // namespace Widget
+} // namespace UI
+} // namespace Inkscape
+
+//should be okay to put this here
+/**
+ * Converts GdkPixbuf's data to premultiplied ARGB.
+ * This function will convert a GdkPixbuf in place into Cairo's native pixel format.
+ * Note that this is a hack intended to save memory. When the pixbuf is in Cairo's format,
+ * using it with GTK will result in corrupted drawings.
+ */
+void
+convert_pixbuf_normal_to_argb32(GdkPixbuf *pb)
+{
+ convert_pixels_pixbuf_to_argb32(
+ gdk_pixbuf_get_pixels(pb),
+ gdk_pixbuf_get_width(pb),
+ gdk_pixbuf_get_height(pb),
+ gdk_pixbuf_get_rowstride(pb));
+}
+
+/**
+ * Converts GdkPixbuf's data back to its native format.
+ * Once this is done, the pixbuf can be used with GTK again.
+ */
+void
+convert_pixbuf_argb32_to_normal(GdkPixbuf *pb)
+{
+ convert_pixels_argb32_to_pixbuf(
+ gdk_pixbuf_get_pixels(pb),
+ gdk_pixbuf_get_width(pb),
+ gdk_pixbuf_get_height(pb),
+ gdk_pixbuf_get_rowstride(pb));
+}
+
+/*
+ Local Variables:
+ mode:c++
+ c-file-style:"stroustrup"
+ c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
+ indent-tabs-mode:nil
+ fill-column:99
+ End:
+*/
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :
+
+
diff --git a/src/ui/widget/highlight-picker.h b/src/ui/widget/highlight-picker.h
new file mode 100644
index 000000000..c5fe4c02c
--- /dev/null
+++ b/src/ui/widget/highlight-picker.h
@@ -0,0 +1,90 @@
+#ifndef __UI_DIALOG_HIGHLIGHT_PICKER_H__
+#define __UI_DIALOG_HIGHLIGHT_PICKER_H__
+/*
+ * Authors:
+ * Theodore Janeczko
+ *
+ * Copyright (C) Theodore Janeczko 2012 <flutterguy317@gmail.com>
+ *
+ * Released under GNU GPL, read the file 'COPYING' for more information
+ */
+
+#if HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <gtkmm/cellrendererpixbuf.h>
+#include <gtkmm/widget.h>
+#include <glibmm/property.h>
+
+namespace Inkscape {
+namespace UI {
+namespace Widget {
+
+class HighlightPicker : public Gtk::CellRendererPixbuf {
+public:
+ HighlightPicker();
+ virtual ~HighlightPicker();
+
+ Glib::PropertyProxy<guint32> property_active() { return _property_active.get_proxy(); }
+
+protected:
+
+#if WITH_GTKMM_3_0
+ virtual void render_vfunc( const Cairo::RefPtr<Cairo::Context>& cr,
+ Gtk::Widget& widget,
+ const Gdk::Rectangle& background_area,
+ const Gdk::Rectangle& cell_area,
+ Gtk::CellRendererState flags );
+
+ virtual void get_preferred_width_vfunc(Gtk::Widget& widget,
+ int& min_w,
+ int& nat_w) const;
+
+ virtual void get_preferred_height_vfunc(Gtk::Widget& widget,
+ int& min_h,
+ int& nat_h) const;
+#else
+ virtual void render_vfunc( const Glib::RefPtr<Gdk::Drawable>& window,
+ Gtk::Widget& widget,
+ const Gdk::Rectangle& background_area,
+ const Gdk::Rectangle& cell_area,
+ const Gdk::Rectangle& expose_area,
+ Gtk::CellRendererState flags );
+
+ virtual void get_size_vfunc( Gtk::Widget &widget,
+ Gdk::Rectangle const *cell_area,
+ int *x_offset, int *y_offset, int *width, int *height ) const;
+#endif
+
+ virtual bool activate_vfunc(GdkEvent *event,
+ Gtk::Widget &widget,
+ const Glib::ustring &path,
+ const Gdk::Rectangle &background_area,
+ const Gdk::Rectangle &cell_area,
+ Gtk::CellRendererState flags);
+
+private:
+
+ Glib::Property<guint32> _property_active;
+};
+
+
+
+} // namespace Widget
+} // namespace UI
+} // namespace Inkscape
+
+
+#endif /* __UI_DIALOG_IMAGETOGGLER_H__ */
+
+/*
+ Local Variables:
+ mode:c++
+ c-file-style:"stroustrup"
+ c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
+ indent-tabs-mode:nil
+ fill-column:99
+ End:
+*/
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :
diff --git a/src/ui/widget/insertordericon.cpp b/src/ui/widget/insertordericon.cpp
new file mode 100644
index 000000000..a28b0f834
--- /dev/null
+++ b/src/ui/widget/insertordericon.cpp
@@ -0,0 +1,165 @@
+/*
+ * Authors:
+ * Theodore Janeczko
+ *
+ * Copyright (C) Theodore Janeczko 2012 <flutterguy317@gmail.com>
+ *
+ * Released under GNU GPL, read the file 'COPYING' for more information
+ */
+
+#include "ui/widget/insertordericon.h"
+
+#include <gtkmm/icontheme.h>
+
+#include "widgets/icon.h"
+#include "widgets/toolbox.h"
+#include "ui/icon-names.h"
+#include "layertypeicon.h"
+
+namespace Inkscape {
+namespace UI {
+namespace Widget {
+
+InsertOrderIcon::InsertOrderIcon() :
+ Glib::ObjectBase(typeid(InsertOrderIcon)),
+ Gtk::CellRendererPixbuf(),
+ _pixTopName(INKSCAPE_ICON("insert-top")),
+ _pixBottomName(INKSCAPE_ICON("insert-bottom")),
+ _property_active(*this, "active", 0),
+ _property_pixbuf_top(*this, "pixbuf_on", Glib::RefPtr<Gdk::Pixbuf>(0)),
+ _property_pixbuf_bottom(*this, "pixbuf_on", Glib::RefPtr<Gdk::Pixbuf>(0))
+{
+
+ property_mode() = Gtk::CELL_RENDERER_MODE_ACTIVATABLE;
+ phys = sp_icon_get_phys_size((int)Inkscape::ICON_SIZE_DECORATION);
+ Glib::RefPtr<Gtk::IconTheme> icon_theme = Gtk::IconTheme::get_default();
+
+ if (!icon_theme->has_icon(_pixTopName)) {
+ Inkscape::queueIconPrerender( INKSCAPE_ICON(_pixTopName.data()), Inkscape::ICON_SIZE_DECORATION );
+ }
+ if (!icon_theme->has_icon(_pixBottomName)) {
+ Inkscape::queueIconPrerender( INKSCAPE_ICON(_pixBottomName.data()), Inkscape::ICON_SIZE_DECORATION );
+ }
+
+ if (icon_theme->has_icon(_pixTopName)) {
+ _property_pixbuf_top = icon_theme->load_icon(_pixTopName, phys, (Gtk::IconLookupFlags)0);
+ }
+ if (icon_theme->has_icon(_pixBottomName)) {
+ _property_pixbuf_bottom = icon_theme->load_icon(_pixBottomName, phys, (Gtk::IconLookupFlags)0);
+ }
+
+ property_pixbuf() = Glib::RefPtr<Gdk::Pixbuf>(0);
+}
+
+
+#if WITH_GTKMM_3_0
+void InsertOrderIcon::get_preferred_height_vfunc(Gtk::Widget& widget,
+ int& min_h,
+ int& nat_h) const
+{
+ Gtk::CellRendererPixbuf::get_preferred_height_vfunc(widget, min_h, nat_h);
+
+ if (min_h) {
+ min_h += (min_h) >> 1;
+ }
+
+ if (nat_h) {
+ nat_h += (nat_h) >> 1;
+ }
+}
+
+void InsertOrderIcon::get_preferred_width_vfunc(Gtk::Widget& widget,
+ int& min_w,
+ int& nat_w) const
+{
+ Gtk::CellRendererPixbuf::get_preferred_width_vfunc(widget, min_w, nat_w);
+
+ if (min_w) {
+ min_w += (min_w) >> 1;
+ }
+
+ if (nat_w) {
+ nat_w += (nat_w) >> 1;
+ }
+}
+#else
+void InsertOrderIcon::get_size_vfunc(Gtk::Widget& widget,
+ const Gdk::Rectangle* cell_area,
+ int* x_offset,
+ int* y_offset,
+ int* width,
+ int* height ) const
+{
+ Gtk::CellRendererPixbuf::get_size_vfunc( widget, cell_area, x_offset, y_offset, width, height );
+
+ if ( width ) {
+ *width = phys;//+= (*width) >> 1;
+ }
+ if ( height ) {
+ *height =phys;//+= (*height) >> 1;
+ }
+}
+#endif
+
+#if WITH_GTKMM_3_0
+void InsertOrderIcon::render_vfunc( const Cairo::RefPtr<Cairo::Context>& cr,
+ Gtk::Widget& widget,
+ const Gdk::Rectangle& background_area,
+ const Gdk::Rectangle& cell_area,
+ Gtk::CellRendererState flags )
+#else
+void InsertOrderIcon::render_vfunc( const Glib::RefPtr<Gdk::Drawable>& window,
+ Gtk::Widget& widget,
+ const Gdk::Rectangle& background_area,
+ const Gdk::Rectangle& cell_area,
+ const Gdk::Rectangle& expose_area,
+ Gtk::CellRendererState flags )
+#endif
+{
+ switch (_property_active.get_value())
+ {
+ case 1:
+ property_pixbuf() = _property_pixbuf_top;
+ break;
+ case 2:
+ property_pixbuf() = _property_pixbuf_bottom;
+ break;
+ default:
+ property_pixbuf() = Glib::RefPtr<Gdk::Pixbuf>(0);
+ break;
+ }
+#if WITH_GTKMM_3_0
+ Gtk::CellRendererPixbuf::render_vfunc( cr, widget, background_area, cell_area, flags );
+#else
+ Gtk::CellRendererPixbuf::render_vfunc( window, widget, background_area, cell_area, expose_area, flags );
+#endif
+}
+
+bool
+InsertOrderIcon::activate_vfunc(GdkEvent* event,
+ Gtk::Widget& /*widget*/,
+ const Glib::ustring& path,
+ const Gdk::Rectangle& /*background_area*/,
+ const Gdk::Rectangle& /*cell_area*/,
+ Gtk::CellRendererState /*flags*/)
+{
+ return false;
+}
+
+
+} // namespace Widget
+} // namespace UI
+} // namespace Inkscape
+
+/*
+ Local Variables:
+ mode:c++
+ c-file-style:"stroustrup"
+ c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
+ indent-tabs-mode:nil
+ fill-column:99
+ End:
+*/
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :
+
+
diff --git a/src/ui/widget/insertordericon.h b/src/ui/widget/insertordericon.h
new file mode 100644
index 000000000..fb3412d3f
--- /dev/null
+++ b/src/ui/widget/insertordericon.h
@@ -0,0 +1,100 @@
+#ifndef __UI_DIALOG_INSERTORDERICON_H__
+#define __UI_DIALOG_INSERTORDERICON_H__
+/*
+ * Authors:
+ * Theodore Janeczko
+ *
+ * Copyright (C) Theodore Janeczko 2012 <flutterguy317@gmail.com>
+ *
+ * Released under GNU GPL, read the file 'COPYING' for more information
+ */
+
+#if HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <glibmm.h>
+#include <gtkmm/cellrendererpixbuf.h>
+#include <gtkmm/widget.h>
+
+namespace Inkscape {
+namespace UI {
+namespace Widget {
+
+class InsertOrderIcon : public Gtk::CellRendererPixbuf {
+public:
+ InsertOrderIcon();
+ virtual ~InsertOrderIcon() {};
+
+ Glib::PropertyProxy<int> property_active() { return _property_active.get_proxy(); }
+ Glib::PropertyProxy< Glib::RefPtr<Gdk::Pixbuf> > property_pixbuf_on();
+ Glib::PropertyProxy< Glib::RefPtr<Gdk::Pixbuf> > property_pixbuf_off();
+
+protected:
+
+#if WITH_GTKMM_3_0
+ virtual void render_vfunc( const Cairo::RefPtr<Cairo::Context>& cr,
+ Gtk::Widget& widget,
+ const Gdk::Rectangle& background_area,
+ const Gdk::Rectangle& cell_area,
+ Gtk::CellRendererState flags );
+
+ virtual void get_preferred_width_vfunc(Gtk::Widget& widget,
+ int& min_w,
+ int& nat_w) const;
+
+ virtual void get_preferred_height_vfunc(Gtk::Widget& widget,
+ int& min_h,
+ int& nat_h) const;
+#else
+ virtual void render_vfunc( const Glib::RefPtr<Gdk::Drawable>& window,
+ Gtk::Widget& widget,
+ const Gdk::Rectangle& background_area,
+ const Gdk::Rectangle& cell_area,
+ const Gdk::Rectangle& expose_area,
+ Gtk::CellRendererState flags );
+
+ virtual void get_size_vfunc( Gtk::Widget &widget,
+ Gdk::Rectangle const *cell_area,
+ int *x_offset, int *y_offset, int *width, int *height ) const;
+#endif
+
+ virtual bool activate_vfunc(GdkEvent *event,
+ Gtk::Widget &widget,
+ const Glib::ustring &path,
+ const Gdk::Rectangle &background_area,
+ const Gdk::Rectangle &cell_area,
+ Gtk::CellRendererState flags);
+
+
+private:
+ int phys;
+
+ Glib::ustring _pixTopName;
+ Glib::ustring _pixBottomName;
+
+ Glib::Property<int> _property_active;
+ Glib::Property< Glib::RefPtr<Gdk::Pixbuf> > _property_pixbuf_top;
+ Glib::Property< Glib::RefPtr<Gdk::Pixbuf> > _property_pixbuf_bottom;
+
+};
+
+
+
+} // namespace Widget
+} // namespace UI
+} // namespace Inkscape
+
+
+#endif /* __UI_DIALOG_IMAGETOGGLER_H__ */
+
+/*
+ Local Variables:
+ mode:c++
+ c-file-style:"stroustrup"
+ c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
+ indent-tabs-mode:nil
+ fill-column:99
+ End:
+*/
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :
diff --git a/src/ui/widget/layertypeicon.cpp b/src/ui/widget/layertypeicon.cpp
new file mode 100644
index 000000000..3d6182bf8
--- /dev/null
+++ b/src/ui/widget/layertypeicon.cpp
@@ -0,0 +1,174 @@
+/*
+ * Authors:
+ * Theodore Janeczko
+ *
+ * Copyright (C) Theodore Janeczko 2012 <flutterguy317@gmail.com>
+ *
+ * Released under GNU GPL, read the file 'COPYING' for more information
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#if GLIBMM_DISABLE_DEPRECATED && HAVE_GLIBMM_THREADS_H
+# include <glibmm/threads.h>
+#endif
+
+#include "ui/widget/layertypeicon.h"
+
+#include <gtkmm/icontheme.h>
+
+#include "widgets/icon.h"
+#include "widgets/toolbox.h"
+#include "ui/icon-names.h"
+#include "layertypeicon.h"
+
+namespace Inkscape {
+namespace UI {
+namespace Widget {
+
+LayerTypeIcon::LayerTypeIcon() :
+ Glib::ObjectBase(typeid(LayerTypeIcon)),
+ Gtk::CellRendererPixbuf(),
+ _pixLayerName(INKSCAPE_ICON("dialog-layers")),
+ _pixGroupName(INKSCAPE_ICON("layer-duplicate")),
+ _pixPathName(INKSCAPE_ICON("layer-rename")),
+ _property_active(*this, "active", false),
+ _property_activatable(*this, "activatable", true),
+ _property_pixbuf_layer(*this, "pixbuf_on", Glib::RefPtr<Gdk::Pixbuf>(0)),
+ _property_pixbuf_group(*this, "pixbuf_off", Glib::RefPtr<Gdk::Pixbuf>(0)),
+ _property_pixbuf_path(*this, "pixbuf_off", Glib::RefPtr<Gdk::Pixbuf>(0))
+{
+
+ property_mode() = Gtk::CELL_RENDERER_MODE_ACTIVATABLE;
+ int phys = sp_icon_get_phys_size((int)Inkscape::ICON_SIZE_DECORATION);
+ Glib::RefPtr<Gtk::IconTheme> icon_theme = Gtk::IconTheme::get_default();
+
+ if (!icon_theme->has_icon(_pixLayerName)) {
+ Inkscape::queueIconPrerender( INKSCAPE_ICON(_pixLayerName.data()), Inkscape::ICON_SIZE_DECORATION );
+ }
+ if (!icon_theme->has_icon(_pixGroupName)) {
+ Inkscape::queueIconPrerender( INKSCAPE_ICON(_pixGroupName.data()), Inkscape::ICON_SIZE_DECORATION );
+ }
+ if (!icon_theme->has_icon(_pixPathName)) {
+ Inkscape::queueIconPrerender( INKSCAPE_ICON(_pixPathName.data()), Inkscape::ICON_SIZE_DECORATION );
+ }
+
+ if (icon_theme->has_icon(_pixLayerName)) {
+ _property_pixbuf_layer = icon_theme->load_icon(_pixLayerName, phys, (Gtk::IconLookupFlags)0);
+ }
+ if (icon_theme->has_icon(_pixGroupName)) {
+ _property_pixbuf_group = icon_theme->load_icon(_pixGroupName, phys, (Gtk::IconLookupFlags)0);
+ }
+ if (icon_theme->has_icon(_pixPathName)) {
+ _property_pixbuf_path = icon_theme->load_icon(_pixPathName, phys, (Gtk::IconLookupFlags)0);
+ }
+
+ property_pixbuf() = _property_pixbuf_path.get_value();
+}
+
+
+#if WITH_GTKMM_3_0
+void LayerTypeIcon::get_preferred_height_vfunc(Gtk::Widget& widget,
+ int& min_h,
+ int& nat_h) const
+{
+ Gtk::CellRendererPixbuf::get_preferred_height_vfunc(widget, min_h, nat_h);
+
+ if (min_h) {
+ min_h += (min_h) >> 1;
+ }
+
+ if (nat_h) {
+ nat_h += (nat_h) >> 1;
+ }
+}
+
+void LayerTypeIcon::get_preferred_width_vfunc(Gtk::Widget& widget,
+ int& min_w,
+ int& nat_w) const
+{
+ Gtk::CellRendererPixbuf::get_preferred_width_vfunc(widget, min_w, nat_w);
+
+ if (min_w) {
+ min_w += (min_w) >> 1;
+ }
+
+ if (nat_w) {
+ nat_w += (nat_w) >> 1;
+ }
+}
+#else
+void LayerTypeIcon::get_size_vfunc(Gtk::Widget& widget,
+ const Gdk::Rectangle* cell_area,
+ int* x_offset,
+ int* y_offset,
+ int* width,
+ int* height ) const
+{
+ Gtk::CellRendererPixbuf::get_size_vfunc( widget, cell_area, x_offset, y_offset, width, height );
+
+ if ( width ) {
+ *width += (*width) >> 1;
+ }
+ if ( height ) {
+ *height += (*height) >> 1;
+ }
+}
+#endif
+
+#if WITH_GTKMM_3_0
+void LayerTypeIcon::render_vfunc( const Cairo::RefPtr<Cairo::Context>& cr,
+ Gtk::Widget& widget,
+ const Gdk::Rectangle& background_area,
+ const Gdk::Rectangle& cell_area,
+ Gtk::CellRendererState flags )
+#else
+void LayerTypeIcon::render_vfunc( const Glib::RefPtr<Gdk::Drawable>& window,
+ Gtk::Widget& widget,
+ const Gdk::Rectangle& background_area,
+ const Gdk::Rectangle& cell_area,
+ const Gdk::Rectangle& expose_area,
+ Gtk::CellRendererState flags )
+#endif
+{
+ property_pixbuf() = _property_active.get_value() == 1 ? _property_pixbuf_group : (_property_active.get_value() == 2 ? _property_pixbuf_layer : _property_pixbuf_path);
+#if WITH_GTKMM_3_0
+ Gtk::CellRendererPixbuf::render_vfunc( cr, widget, background_area, cell_area, flags );
+#else
+ Gtk::CellRendererPixbuf::render_vfunc( window, widget, background_area, cell_area, expose_area, flags );
+#endif
+}
+
+bool
+LayerTypeIcon::activate_vfunc(GdkEvent* event,
+ Gtk::Widget& /*widget*/,
+ const Glib::ustring& path,
+ const Gdk::Rectangle& /*background_area*/,
+ const Gdk::Rectangle& /*cell_area*/,
+ Gtk::CellRendererState /*flags*/)
+{
+ _signal_pre_toggle.emit(event);
+ _signal_toggled.emit(path);
+
+ return false;
+}
+
+
+} // namespace Widget
+} // namespace UI
+} // namespace Inkscape
+
+/*
+ Local Variables:
+ mode:c++
+ c-file-style:"stroustrup"
+ c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
+ indent-tabs-mode:nil
+ fill-column:99
+ End:
+*/
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :
+
+
diff --git a/src/ui/widget/layertypeicon.h b/src/ui/widget/layertypeicon.h
new file mode 100644
index 000000000..6c71ce361
--- /dev/null
+++ b/src/ui/widget/layertypeicon.h
@@ -0,0 +1,108 @@
+#ifndef __UI_DIALOG_LAYERTYPEICON_H__
+#define __UI_DIALOG_LAYERTYPEICON_H__
+/*
+ * Authors:
+ * Theodore Janeczko
+ *
+ * Copyright (C) Theodore Janeczko 2012 <flutterguy317@gmail.com>
+ *
+ * Released under GNU GPL, read the file 'COPYING' for more information
+ */
+
+#if HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <gtkmm/cellrendererpixbuf.h>
+#include <gtkmm/widget.h>
+#include <glibmm/property.h>
+
+namespace Inkscape {
+namespace UI {
+namespace Widget {
+
+class LayerTypeIcon : public Gtk::CellRendererPixbuf {
+public:
+ LayerTypeIcon();
+ virtual ~LayerTypeIcon() {};
+
+ sigc::signal<void, const Glib::ustring&> signal_toggled() { return _signal_toggled;}
+ sigc::signal<void, GdkEvent const *> signal_pre_toggle() { return _signal_pre_toggle; }
+
+ Glib::PropertyProxy<int> property_active() { return _property_active.get_proxy(); }
+ Glib::PropertyProxy<int> property_activatable() { return _property_activatable.get_proxy(); }
+ Glib::PropertyProxy< Glib::RefPtr<Gdk::Pixbuf> > property_pixbuf_on();
+ Glib::PropertyProxy< Glib::RefPtr<Gdk::Pixbuf> > property_pixbuf_off();
+
+protected:
+
+#if WITH_GTKMM_3_0
+ virtual void render_vfunc( const Cairo::RefPtr<Cairo::Context>& cr,
+ Gtk::Widget& widget,
+ const Gdk::Rectangle& background_area,
+ const Gdk::Rectangle& cell_area,
+ Gtk::CellRendererState flags );
+
+ virtual void get_preferred_width_vfunc(Gtk::Widget& widget,
+ int& min_w,
+ int& nat_w) const;
+
+ virtual void get_preferred_height_vfunc(Gtk::Widget& widget,
+ int& min_h,
+ int& nat_h) const;
+#else
+ virtual void render_vfunc( const Glib::RefPtr<Gdk::Drawable>& window,
+ Gtk::Widget& widget,
+ const Gdk::Rectangle& background_area,
+ const Gdk::Rectangle& cell_area,
+ const Gdk::Rectangle& expose_area,
+ Gtk::CellRendererState flags );
+
+ virtual void get_size_vfunc( Gtk::Widget &widget,
+ Gdk::Rectangle const *cell_area,
+ int *x_offset, int *y_offset, int *width, int *height ) const;
+#endif
+
+ virtual bool activate_vfunc(GdkEvent *event,
+ Gtk::Widget &widget,
+ const Glib::ustring &path,
+ const Gdk::Rectangle &background_area,
+ const Gdk::Rectangle &cell_area,
+ Gtk::CellRendererState flags);
+
+
+private:
+ Glib::ustring _pixLayerName;
+ Glib::ustring _pixGroupName;
+ Glib::ustring _pixPathName;
+
+ Glib::Property<int> _property_active;
+ Glib::Property<int> _property_activatable;
+ Glib::Property< Glib::RefPtr<Gdk::Pixbuf> > _property_pixbuf_layer;
+ Glib::Property< Glib::RefPtr<Gdk::Pixbuf> > _property_pixbuf_group;
+ Glib::Property< Glib::RefPtr<Gdk::Pixbuf> > _property_pixbuf_path;
+
+ sigc::signal<void, const Glib::ustring&> _signal_toggled;
+ sigc::signal<void, GdkEvent const *> _signal_pre_toggle;
+
+};
+
+
+
+} // namespace Widget
+} // namespace UI
+} // namespace Inkscape
+
+
+#endif /* __UI_DIALOG_IMAGETOGGLER_H__ */
+
+/*
+ Local Variables:
+ mode:c++
+ c-file-style:"stroustrup"
+ c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
+ indent-tabs-mode:nil
+ fill-column:99
+ End:
+*/
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :
diff --git a/src/ui/widget/licensor.cpp b/src/ui/widget/licensor.cpp
index 42f352e3c..7429bb07e 100644
--- a/src/ui/widget/licensor.cpp
+++ b/src/ui/widget/licensor.cpp
@@ -160,9 +160,9 @@ void Licensor::update (SPDocument *doc)
Local Variables:
mode:c++
c-file-style:"stroustrup"
- c-file-offsets:((innamespace . 0)(inline-open . 0))
+ c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
indent-tabs-mode:nil
fill-column:99
End:
*/
-// vim: filetype=c++:expandtab:shiftwidth=4:tabstop=8:softtabstop=4 :
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :
diff --git a/src/ui/widget/licensor.h b/src/ui/widget/licensor.h
index 0ac3e5ab8..c75c5fe9e 100644
--- a/src/ui/widget/licensor.h
+++ b/src/ui/widget/licensor.h
@@ -56,9 +56,9 @@ protected:
Local Variables:
mode:c++
c-file-style:"stroustrup"
- c-file-offsets:((innamespace . 0)(inline-open . 0))
+ c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
indent-tabs-mode:nil
fill-column:99
End:
*/
-// vim: filetype=c++:expandtab:shiftwidth=4:tabstop=8:softtabstop=4 :
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :
diff --git a/src/ui/widget/notebook-page.cpp b/src/ui/widget/notebook-page.cpp
index 6653499b8..2f03ed23b 100644
--- a/src/ui/widget/notebook-page.cpp
+++ b/src/ui/widget/notebook-page.cpp
@@ -44,13 +44,13 @@ NotebookPage::NotebookPage(int n_rows, int n_columns, bool expand, bool fill, gu
} // namespace UI
} // namespace Inkscape
-/*
+/*
Local Variables:
mode:c++
c-file-style:"stroustrup"
- c-file-offsets:((innamespace . 0)(inline-open . 0))
+ c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
indent-tabs-mode:nil
fill-column:99
End:
*/
-// vim: filetype=c++:expandtab:shiftwidth=4:tabstop=8:softtabstop=4 :
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :
diff --git a/src/ui/widget/notebook-page.h b/src/ui/widget/notebook-page.h
index 38ae9e054..4f7915423 100644
--- a/src/ui/widget/notebook-page.h
+++ b/src/ui/widget/notebook-page.h
@@ -67,13 +67,13 @@ protected:
#endif // INKSCAPE_UI_WIDGET_NOTEBOOK_PAGE_H
-/*
+/*
Local Variables:
mode:c++
c-file-style:"stroustrup"
- c-file-offsets:((innamespace . 0)(inline-open . 0))
+ c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
indent-tabs-mode:nil
fill-column:99
End:
*/
-// vim: filetype=c++:expandtab:shiftwidth=4:tabstop=8:softtabstop=4 :
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :
diff --git a/src/ui/widget/object-composite-settings.cpp b/src/ui/widget/object-composite-settings.cpp
index 537db0fdd..e4cd76345 100644
--- a/src/ui/widget/object-composite-settings.cpp
+++ b/src/ui/widget/object-composite-settings.cpp
@@ -40,7 +40,7 @@ namespace UI {
namespace Widget {
/*void ObjectCompositeSettings::_on_desktop_activate(
- Inkscape::Application *application,
+ InkscapeApplication *application,
SPDesktop *desktop,
ObjectCompositeSettings *w
) {
@@ -50,7 +50,7 @@ namespace Widget {
}
void ObjectCompositeSettings::_on_desktop_deactivate(
- Inkscape::Application *application,
+ InkscapeApplication *application,
SPDesktop *desktop,
ObjectCompositeSettings *w
) {
diff --git a/src/ui/widget/object-composite-settings.h b/src/ui/widget/object-composite-settings.h
index 19a6cb2a5..e375bf24a 100644
--- a/src/ui/widget/object-composite-settings.h
+++ b/src/ui/widget/object-composite-settings.h
@@ -30,9 +30,9 @@
#include "ui/widget/spinbutton.h"
class SPDesktop;
+struct InkscapeApplication;
namespace Inkscape {
-struct Application;
namespace UI {
namespace Widget {
@@ -66,8 +66,8 @@ private:
gulong _desktop_activated;
sigc::connection _subject_changed;
- static void _on_desktop_activate(Inkscape::Application *application, SPDesktop *desktop, ObjectCompositeSettings *w);
- static void _on_desktop_deactivate(Inkscape::Application *application, SPDesktop *desktop, ObjectCompositeSettings *w);
+ static void _on_desktop_activate(InkscapeApplication *application, SPDesktop *desktop, ObjectCompositeSettings *w);
+ static void _on_desktop_deactivate(InkscapeApplication *application, SPDesktop *desktop, ObjectCompositeSettings *w);
void _subjectChanged();
void _blendBlurValueChanged();
void _opacityValueChanged();
diff --git a/src/ui/widget/page-sizer.cpp b/src/ui/widget/page-sizer.cpp
index eae0d4a95..89b0b8f7e 100644
--- a/src/ui/widget/page-sizer.cpp
+++ b/src/ui/widget/page-sizer.cpp
@@ -728,9 +728,9 @@ PageSizer::on_units_changed()
Local Variables:
mode:c++
c-file-style:"stroustrup"
- c-file-offsets:((innamespace . 0)(inline-open . 0))
+ c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
indent-tabs-mode:nil
fill-column:99
End:
*/
-// vim: filetype=c++:expandtab:shiftwidth=4:tabstop=8:softtabstop=4 :
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :
diff --git a/src/ui/widget/page-sizer.h b/src/ui/widget/page-sizer.h
index dc8e34d82..f4bcae4b6 100644
--- a/src/ui/widget/page-sizer.h
+++ b/src/ui/widget/page-sizer.h
@@ -277,9 +277,9 @@ protected:
Local Variables:
mode:c++
c-file-style:"stroustrup"
- c-file-offsets:((innamespace . 0)(inline-open . 0))
+ c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
indent-tabs-mode:nil
fill-column:99
End:
*/
-// vim: filetype=c++:expandtab:shiftwidth=4:tabstop=8:softtabstop=4 :
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :
diff --git a/src/ui/widget/panel.cpp b/src/ui/widget/panel.cpp
index b37137228..0abd81b16 100644
--- a/src/ui/widget/panel.cpp
+++ b/src/ui/widget/panel.cpp
@@ -643,13 +643,13 @@ Panel::signalDocumentReplaced()
return _signal_document_replaced;
}
-sigc::signal<void, Inkscape::Application *, SPDesktop *> &
+sigc::signal<void, InkscapeApplication *, SPDesktop *> &
Panel::signalActivateDesktop()
{
return _signal_activate_desktop;
}
-sigc::signal<void, Inkscape::Application *, SPDesktop *> &
+sigc::signal<void, InkscapeApplication *, SPDesktop *> &
Panel::signalDeactiveDesktop()
{
return _signal_deactive_desktop;
diff --git a/src/ui/widget/panel.h b/src/ui/widget/panel.h
index 0c3d822b8..177314797 100644
--- a/src/ui/widget/panel.h
+++ b/src/ui/widget/panel.h
@@ -45,9 +45,9 @@ namespace Gtk {
class MenuItem;
}
-namespace Inkscape {
+struct InkscapeApplication;
-struct Application;
+namespace Inkscape {
class Selection;
namespace UI {
@@ -116,8 +116,8 @@ public:
void setResponseSensitive(int response_id, bool setting);
virtual sigc::signal<void, SPDesktop *, SPDocument *> &signalDocumentReplaced();
- virtual sigc::signal<void, Inkscape::Application *, SPDesktop *> &signalActivateDesktop();
- virtual sigc::signal<void, Inkscape::Application *, SPDesktop *> &signalDeactiveDesktop();
+ virtual sigc::signal<void, InkscapeApplication *, SPDesktop *> &signalActivateDesktop();
+ virtual sigc::signal<void, InkscapeApplication *, SPDesktop *> &signalDeactiveDesktop();
protected:
/**
@@ -147,8 +147,8 @@ protected:
sigc::signal<void, int> _signal_response;
sigc::signal<void> _signal_present;
sigc::signal<void, SPDesktop *, SPDocument *> _signal_document_replaced;
- sigc::signal<void, Inkscape::Application *, SPDesktop *> _signal_activate_desktop;
- sigc::signal<void, Inkscape::Application *, SPDesktop *> _signal_deactive_desktop;
+ sigc::signal<void, InkscapeApplication *, SPDesktop *> _signal_activate_desktop;
+ sigc::signal<void, InkscapeApplication *, SPDesktop *> _signal_deactive_desktop;
private:
void _init();
diff --git a/src/ui/widget/preferences-widget.cpp b/src/ui/widget/preferences-widget.cpp
index 3ba00c083..7f3e6cd47 100644
--- a/src/ui/widget/preferences-widget.cpp
+++ b/src/ui/widget/preferences-widget.cpp
@@ -14,10 +14,6 @@
# include <config.h>
#endif
-#ifdef WIN32
-#include <windows.h>
-#endif
-
#if GLIBMM_DISABLE_DEPRECATED && HAVE_GLIBMM_THREADS_H
#include <glibmm/threads.h>
#endif
@@ -49,6 +45,10 @@
#include <glibmm/convert.h>
#include <glibmm/i18n.h>
+#ifdef WIN32
+#include <windows.h>
+#endif
+
using namespace Inkscape::UI::Widget;
namespace Inkscape {
diff --git a/src/ui/widget/preferences-widget.h b/src/ui/widget/preferences-widget.h
index cb4ce17d1..5d9816e74 100644
--- a/src/ui/widget/preferences-widget.h
+++ b/src/ui/widget/preferences-widget.h
@@ -306,9 +306,9 @@ public:
Local Variables:
mode:c++
c-file-style:"stroustrup"
- c-file-offsets:((innamespace . 0)(inline-open . 0))
+ c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
indent-tabs-mode:nil
fill-column:99
End:
*/
-// vim: filetype=c++:expandtab:shiftwidth=4:tabstop=8:softtabstop=4 :
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :
diff --git a/src/ui/widget/registered-widget.cpp b/src/ui/widget/registered-widget.cpp
index 92cb3f03d..44d8dcbf3 100644
--- a/src/ui/widget/registered-widget.cpp
+++ b/src/ui/widget/registered-widget.cpp
@@ -99,6 +99,59 @@ RegisteredCheckButton::on_toggled()
_wr->setUpdating (false);
}
+/*#########################################
+ * Registered TOGGLEBUTTON
+ */
+
+RegisteredToggleButton::~RegisteredToggleButton()
+{
+ _toggled_connection.disconnect();
+}
+
+RegisteredToggleButton::RegisteredToggleButton (const Glib::ustring& label, const Glib::ustring& tip, const Glib::ustring& key, Registry& wr, bool right, Inkscape::XML::Node* repr_in, SPDocument *doc_in, char const *active_str, char const *inactive_str)
+ : RegisteredWidget<Gtk::ToggleButton>()
+ , _active_str(active_str)
+ , _inactive_str(inactive_str)
+{
+ init_parent(key, wr, repr_in, doc_in);
+ setProgrammatically = false;
+ set_tooltip_text (tip);
+ set_alignment (right? 1.0 : 0.0, 0.5);
+ _toggled_connection = signal_toggled().connect (sigc::mem_fun (*this, &RegisteredToggleButton::on_toggled));
+}
+
+void
+RegisteredToggleButton::setActive (bool b)
+{
+ setProgrammatically = true;
+ set_active (b);
+ //The slave button is greyed out if the master button is untoggled
+ for (std::list<Gtk::Widget*>::const_iterator i = _slavewidgets.begin(); i != _slavewidgets.end(); ++i) {
+ (*i)->set_sensitive(b);
+ }
+ setProgrammatically = false;
+}
+
+void
+RegisteredToggleButton::on_toggled()
+{
+ if (setProgrammatically) {
+ setProgrammatically = false;
+ return;
+ }
+
+ if (_wr->isUpdating())
+ return;
+ _wr->setUpdating (true);
+
+ write_to_xml(get_active() ? _active_str : _inactive_str);
+ //The slave button is greyed out if the master button is untoggled
+ for (std::list<Gtk::Widget*>::const_iterator i = _slavewidgets.begin(); i != _slavewidgets.end(); ++i) {
+ (*i)->set_sensitive(get_active());
+ }
+
+ _wr->setUpdating (false);
+}
/*#########################################
* Registered UNITMENU
@@ -735,9 +788,9 @@ RegisteredRandom::on_value_changed()
Local Variables:
mode:c++
c-file-style:"stroustrup"
- c-file-offsets:((innamespace . 0)(inline-open . 0))
+ c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
indent-tabs-mode:nil
fill-column:99
End:
*/
-// vim: filetype=c++:expandtab:shiftwidth=4:tabstop=8:softtabstop=4 :
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :
diff --git a/src/ui/widget/registered-widget.h b/src/ui/widget/registered-widget.h
index d64c09c16..1f505a3cd 100644
--- a/src/ui/widget/registered-widget.h
+++ b/src/ui/widget/registered-widget.h
@@ -163,6 +163,31 @@ protected:
void on_toggled();
};
+class RegisteredToggleButton : public RegisteredWidget<Gtk::ToggleButton> {
+public:
+ virtual ~RegisteredToggleButton();
+ RegisteredToggleButton (const Glib::ustring& label, const Glib::ustring& tip, const Glib::ustring& key, Registry& wr, bool right=true, Inkscape::XML::Node* repr_in=NULL, SPDocument *doc_in=NULL, char const *active_str = "true", char const *inactive_str = "false");
+
+ void setActive (bool);
+
+ std::list<Gtk::Widget*> _slavewidgets;
+
+ // a slave button is only sensitive when the master button is active
+ // i.e. a slave button is greyed-out when the master button is not checked
+
+ void setSlaveWidgets(std::list<Gtk::Widget*> btns) {
+ _slavewidgets = btns;
+ }
+
+ bool setProgrammatically; // true if the value was set by setActive, not changed by the user;
+ // if a callback checks it, it must reset it back to false
+
+protected:
+ char const *_active_str, *_inactive_str;
+ sigc::connection _toggled_connection;
+ void on_toggled();
+};
+
class RegisteredUnitMenu : public RegisteredWidget<Labelled> {
public:
~RegisteredUnitMenu();
@@ -394,9 +419,9 @@ protected:
Local Variables:
mode:c++
c-file-style:"stroustrup"
- c-file-offsets:((innamespace . 0)(inline-open . 0))
+ c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
indent-tabs-mode:nil
fill-column:99
End:
*/
-// vim: filetype=c++:expandtab:shiftwidth=4:tabstop=8:softtabstop=4 :
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :
diff --git a/src/ui/widget/registry.cpp b/src/ui/widget/registry.cpp
index 725e52791..ea8198422 100644
--- a/src/ui/widget/registry.cpp
+++ b/src/ui/widget/registry.cpp
@@ -48,9 +48,9 @@ Registry::setUpdating (bool upd)
Local Variables:
mode:c++
c-file-style:"stroustrup"
- c-file-offsets:((innamespace . 0)(inline-open . 0))
+ c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
indent-tabs-mode:nil
fill-column:99
End:
*/
-// vim: filetype=c++:expandtab:shiftwidth=4:tabstop=8:softtabstop=4 :
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :
diff --git a/src/ui/widget/registry.h b/src/ui/widget/registry.h
index 2da29735c..a236b96ad 100644
--- a/src/ui/widget/registry.h
+++ b/src/ui/widget/registry.h
@@ -39,9 +39,9 @@ protected:
Local Variables:
mode:c++
c-file-style:"stroustrup"
- c-file-offsets:((innamespace . 0)(inline-open . 0))
+ c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
indent-tabs-mode:nil
fill-column:99
End:
*/
-// vim: filetype=c++:expandtab:shiftwidth=4:tabstop=8:softtabstop=4 :
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :
diff --git a/src/ui/widget/rotateable.cpp b/src/ui/widget/rotateable.cpp
index 72ec69362..2d7597d7c 100644
--- a/src/ui/widget/rotateable.cpp
+++ b/src/ui/widget/rotateable.cpp
@@ -173,13 +173,13 @@ Rotateable::~Rotateable() {
} // namespace UI
} // namespace Inkscape
-/*
+/*
Local Variables:
mode:c++
c-file-style:"stroustrup"
- c-file-offsets:((innamespace . 0)(inline-open . 0))
+ c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
indent-tabs-mode:nil
fill-column:99
End:
*/
-// vim: filetype=c++:expandtab:shiftwidth=4:tabstop=8:softtabstop=4 :
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :
diff --git a/src/ui/widget/rotateable.h b/src/ui/widget/rotateable.h
index 52fb5306c..6404c3550 100644
--- a/src/ui/widget/rotateable.h
+++ b/src/ui/widget/rotateable.h
@@ -62,9 +62,9 @@ private:
Local Variables:
mode:c++
c-file-style:"stroustrup"
- c-file-offsets:((innamespace . 0)(inline-open . 0))
+ c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
indent-tabs-mode:nil
fill-column:99
End:
*/
-// vim: filetype=c++:expandtab:shiftwidth=4:tabstop=8:softtabstop=4 :
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :
diff --git a/src/ui/widget/selected-style.cpp b/src/ui/widget/selected-style.cpp
index a575dd592..d22c59aa4 100644
--- a/src/ui/widget/selected-style.cpp
+++ b/src/ui/widget/selected-style.cpp
@@ -25,6 +25,7 @@
#include "desktop-style.h"
#include "sp-namedview.h"
#include "sp-linear-gradient.h"
+#include "sp-mesh-gradient.h"
#include "sp-radial-gradient.h"
#include "sp-pattern.h"
#include "ui/dialog/dialog-manager.h"
@@ -213,6 +214,18 @@ SelectedStyle::SelectedStyle(bool /*layout*/)
_gradient_box_r[i].pack_start(*(Glib::wrap(_gradient_preview_r[i])));
_gradient_box_r[i].show_all();
+#ifdef WITH_MESH
+ _mgradient[i].set_markup (_("<b>M</b>"));
+ sp_set_font_size_smaller (GTK_WIDGET(_mgradient[i].gobj()));
+ _mgradient[i].show_all();
+ __mgradient[i] = (i == SS_FILL)? (_("Mesh gradient fill")) : (_("Mesh gradient stroke"));
+
+ _gradient_preview_m[i] = GTK_WIDGET(sp_gradient_image_new (NULL));
+ _gradient_box_m[i].pack_start(_mgradient[i]);
+ _gradient_box_m[i].pack_start(*(Glib::wrap(_gradient_preview_m[i])));
+ _gradient_box_m[i].show_all();
+#endif
+
_many[i].set_markup (_("Different"));
sp_set_font_size_smaller (GTK_WIDGET(_many[i].gobj()));
_many[i].show_all();
@@ -1032,6 +1045,14 @@ SelectedStyle::update()
place->add(_gradient_box_r[i]);
place->set_tooltip_text(__rgradient[i]);
_mode[i] = SS_RGRADIENT;
+#ifdef WITH_MESH
+ } else if (SP_IS_MESHGRADIENT(server)) {
+ SPGradient *vector = SP_GRADIENT(server)->getVector();
+ sp_gradient_image_set_gradient(SP_GRADIENT_IMAGE(_gradient_preview_m[i]), vector);
+ place->add(_gradient_box_m[i]);
+ place->set_tooltip_text(__mgradient[i]);
+ _mode[i] = SS_MGRADIENT;
+#endif
} else if (SP_IS_PATTERN (server)) {
place->add(_pattern[i]);
place->set_tooltip_text(__pattern[i]);
@@ -1556,9 +1577,9 @@ Dialog::FillAndStroke *get_fill_and_stroke_panel(SPDesktop *desktop)
Local Variables:
mode:c++
c-file-style:"stroustrup"
- c-file-offsets:((innamespace . 0)(inline-open . 0))
+ c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
indent-tabs-mode:nil
fill-column:99
End:
*/
-// vim: filetype=c++:expandtab:shiftwidth=4:tabstop=8:softtabstop=4 :
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :
diff --git a/src/ui/widget/selected-style.h b/src/ui/widget/selected-style.h
index 9557a8d74..0b6a14762 100644
--- a/src/ui/widget/selected-style.h
+++ b/src/ui/widget/selected-style.h
@@ -60,6 +60,9 @@ enum {
SS_PATTERN,
SS_LGRADIENT,
SS_RGRADIENT,
+#ifdef WITH_MESH
+ SS_MGRADIENT,
+#endif
SS_MANY,
SS_COLOR
};
@@ -186,6 +189,14 @@ protected:
GtkWidget *_gradient_preview_r[2];
Gtk::HBox _gradient_box_r[2];
+#ifdef WITH_MESH
+ Gtk::Label _mgradient[2];
+ Glib::ustring __mgradient[2];
+
+ GtkWidget *_gradient_preview_m[2];
+ Gtk::HBox _gradient_box_m[2];
+#endif
+
Gtk::Label _many[2];
Glib::ustring __many[2];
@@ -290,13 +301,13 @@ protected:
#endif // INKSCAPE_UI_WIDGET_BUTTON_H
-/*
+/*
Local Variables:
mode:c++
c-file-style:"stroustrup"
- c-file-offsets:((innamespace . 0)(inline-open . 0))
+ c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
indent-tabs-mode:nil
fill-column:99
End:
*/
-// vim: filetype=c++:expandtab:shiftwidth=4:tabstop=8:softtabstop=4 :
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :
diff --git a/src/ui/widget/spin-scale.cpp b/src/ui/widget/spin-scale.cpp
index ade3d1e60..bb08d67df 100644
--- a/src/ui/widget/spin-scale.cpp
+++ b/src/ui/widget/spin-scale.cpp
@@ -235,13 +235,13 @@ void DualSpinScale::update_linked()
} // namespace UI
} // namespace Inkscape
-/*
+/*
Local Variables:
mode:c++
c-file-style:"stroustrup"
- c-file-offsets:((innamespace . 0)(inline-open . 0))
+ c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
indent-tabs-mode:nil
fill-column:99
End:
*/
-// vim: filetype=c++:expandtab:shiftwidth=4:tabstop=8:softtabstop=4 :
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :
diff --git a/src/ui/widget/spin-scale.h b/src/ui/widget/spin-scale.h
index 5fec8b1d8..d0447e4a6 100644
--- a/src/ui/widget/spin-scale.h
+++ b/src/ui/widget/spin-scale.h
@@ -113,13 +113,13 @@ private:
#endif // INKSCAPE_UI_WIDGET_SPIN_SCALE_H
-/*
+/*
Local Variables:
mode:c++
c-file-style:"stroustrup"
- c-file-offsets:((innamespace . 0)(inline-open . 0))
+ c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
indent-tabs-mode:nil
fill-column:99
End:
*/
-// vim: filetype=c++:expandtab:shiftwidth=4:tabstop=8:softtabstop=4 :
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :
diff --git a/src/ui/widget/spin-slider.cpp b/src/ui/widget/spin-slider.cpp
index 1cb59a7b3..9b361ae78 100644
--- a/src/ui/widget/spin-slider.cpp
+++ b/src/ui/widget/spin-slider.cpp
@@ -262,13 +262,13 @@ void DualSpinSlider::update_linked()
} // namespace UI
} // namespace Inkscape
-/*
+/*
Local Variables:
mode:c++
c-file-style:"stroustrup"
- c-file-offsets:((innamespace . 0)(inline-open . 0))
+ c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
indent-tabs-mode:nil
fill-column:99
End:
*/
-// vim: filetype=c++:expandtab:shiftwidth=4:tabstop=8:softtabstop=4 :
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :
diff --git a/src/ui/widget/spin-slider.h b/src/ui/widget/spin-slider.h
index 5f86fd15a..74982ea58 100644
--- a/src/ui/widget/spin-slider.h
+++ b/src/ui/widget/spin-slider.h
@@ -111,13 +111,13 @@ private:
#endif // INKSCAPE_UI_WIDGET_SPIN_SLIDER_H
-/*
+/*
Local Variables:
mode:c++
c-file-style:"stroustrup"
- c-file-offsets:((innamespace . 0)(inline-open . 0))
+ c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
indent-tabs-mode:nil
fill-column:99
End:
*/
-// vim: filetype=c++:expandtab:shiftwidth=4:tabstop=8:softtabstop=4 :
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :
diff --git a/src/ui/widget/spinbutton.cpp b/src/ui/widget/spinbutton.cpp
index 7709a837b..d7669d4e5 100644
--- a/src/ui/widget/spinbutton.cpp
+++ b/src/ui/widget/spinbutton.cpp
@@ -100,13 +100,13 @@ void SpinButton::undo()
} // namespace UI
} // namespace Inkscape
-/*
+/*
Local Variables:
mode:c++
c-file-style:"stroustrup"
- c-file-offsets:((innamespace . 0)(inline-open . 0))
+ c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
indent-tabs-mode:nil
fill-column:99
End:
*/
-// vim: filetype=c++:expandtab:shiftwidth=4:tabstop=8:softtabstop=4 :
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :
diff --git a/src/ui/widget/spinbutton.h b/src/ui/widget/spinbutton.h
index 812b5f515..cbe33e8ea 100644
--- a/src/ui/widget/spinbutton.h
+++ b/src/ui/widget/spinbutton.h
@@ -111,13 +111,13 @@ private:
#endif // INKSCAPE_UI_WIDGET_SPINBUTTON_H
-/*
+/*
Local Variables:
mode:c++
c-file-style:"stroustrup"
- c-file-offsets:((innamespace . 0)(inline-open . 0))
+ c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
indent-tabs-mode:nil
fill-column:99
End:
*/
-// vim: filetype=c++:expandtab:shiftwidth=4:tabstop=8:softtabstop=4 :
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :
diff --git a/src/ui/widget/style-swatch.cpp b/src/ui/widget/style-swatch.cpp
index 98f4e47cd..157fd2ad9 100644
--- a/src/ui/widget/style-swatch.cpp
+++ b/src/ui/widget/style-swatch.cpp
@@ -386,9 +386,9 @@ void StyleSwatch::setStyle(SPStyle *query)
Local Variables:
mode:c++
c-file-style:"stroustrup"
- c-file-offsets:((innamespace . 0)(inline-open . 0))
+ c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
indent-tabs-mode:nil
fill-column:99
End:
*/
-// vim: filetype=c++:expandtab:shiftwidth=4:tabstop=8:softtabstop=4 :
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :
diff --git a/src/ui/widget/style-swatch.h b/src/ui/widget/style-swatch.h
index 557ca82e2..582d2ebb3 100644
--- a/src/ui/widget/style-swatch.h
+++ b/src/ui/widget/style-swatch.h
@@ -108,13 +108,13 @@ friend class ToolObserver;
#endif // INKSCAPE_UI_WIDGET_BUTTON_H
-/*
+/*
Local Variables:
mode:c++
c-file-style:"stroustrup"
- c-file-offsets:((innamespace . 0)(inline-open . 0))
+ c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
indent-tabs-mode:nil
fill-column:99
End:
*/
-// vim: filetype=c++:expandtab:shiftwidth=4:tabstop=8:softtabstop=4 :
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :
diff --git a/src/ui/widget/tolerance-slider.cpp b/src/ui/widget/tolerance-slider.cpp
index 5fc588fdc..aac7451f4 100644
--- a/src/ui/widget/tolerance-slider.cpp
+++ b/src/ui/widget/tolerance-slider.cpp
@@ -216,9 +216,9 @@ void ToleranceSlider::update (double val)
Local Variables:
mode:c++
c-file-style:"stroustrup"
- c-file-offsets:((innamespace . 0)(inline-open . 0))
+ c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
indent-tabs-mode:nil
fill-column:99
End:
*/
-// vim: filetype=c++:expandtab:shiftwidth=4:tabstop=8:softtabstop=4 :
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :
diff --git a/src/ui/widget/tolerance-slider.h b/src/ui/widget/tolerance-slider.h
index 2184cd52b..7ae8e4712 100644
--- a/src/ui/widget/tolerance-slider.h
+++ b/src/ui/widget/tolerance-slider.h
@@ -88,9 +88,9 @@ protected:
Local Variables:
mode:c++
c-file-style:"stroustrup"
- c-file-offsets:((innamespace . 0)(inline-open . 0))
+ c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
indent-tabs-mode:nil
fill-column:99
End:
*/
-// vim: filetype=c++:expandtab:shiftwidth=4:tabstop=8:softtabstop=4 :
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :
diff --git a/src/ui/widget/unit-menu.cpp b/src/ui/widget/unit-menu.cpp
index 7416a2f02..423313a1f 100644
--- a/src/ui/widget/unit-menu.cpp
+++ b/src/ui/widget/unit-menu.cpp
@@ -140,13 +140,13 @@ bool UnitMenu::isRadial() const
} // namespace UI
} // namespace Inkscape
-/*
+/*
Local Variables:
mode:c++
c-file-style:"stroustrup"
- c-file-offsets:((innamespace . 0)(inline-open . 0))
+ c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
indent-tabs-mode:nil
fill-column:99
End:
*/
-// vim: filetype=c++:expandtab:shiftwidth=4:tabstop=8:softtabstop=4 :
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :
diff --git a/src/ui/widget/unit-menu.h b/src/ui/widget/unit-menu.h
index 114c536c9..2fd25a6a9 100644
--- a/src/ui/widget/unit-menu.h
+++ b/src/ui/widget/unit-menu.h
@@ -141,9 +141,9 @@ protected:
Local Variables:
mode:c++
c-file-style:"stroustrup"
- c-file-offsets:((innamespace . 0)(inline-open . 0))
+ c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
indent-tabs-mode:nil
fill-column:99
End:
*/
-// vim: filetype=c++:expandtab:shiftwidth=4:tabstop=8:softtabstop=4 :
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :
diff --git a/src/ui/widget/unit-tracker.cpp b/src/ui/widget/unit-tracker.cpp
index 67eb1f48d..c6318db25 100644
--- a/src/ui/widget/unit-tracker.cpp
+++ b/src/ui/widget/unit-tracker.cpp
@@ -13,7 +13,7 @@
*/
#include "unit-tracker.h"
-#include "ege-select-one-action.h"
+#include "widgets/ege-select-one-action.h"
#define COLUMN_STRING 0
diff --git a/src/ui/widget/unit-tracker.h b/src/ui/widget/unit-tracker.h
index 61bb556ef..06245930e 100644
--- a/src/ui/widget/unit-tracker.h
+++ b/src/ui/widget/unit-tracker.h
@@ -16,13 +16,16 @@
#define INKSCAPE_UI_WIDGET_UNIT_TRACKER_H
#include <map>
-#include <gtk/gtk.h>
-
#include "util/units.h"
using Inkscape::Util::Unit;
using Inkscape::Util::UnitType;
+typedef struct _GObject GObject;
+typedef struct _GtkAction GtkAction;
+typedef struct _GtkAdjustment GtkAdjustment;
+typedef struct _GtkListStore GtkListStore;
+
namespace Inkscape {
namespace UI {
namespace Widget {
diff --git a/src/unclump.cpp b/src/unclump.cpp
index 1427e8eab..940369d7a 100644
--- a/src/unclump.cpp
+++ b/src/unclump.cpp
@@ -17,6 +17,7 @@
#include "sp-item.h"
#include "unclump.h"
+#include <glib.h>
// Taking bbox of an item is an expensive operation, and we need to do it many times, so here we
// cache the centers, widths, and heights of items
diff --git a/src/unclump.h b/src/unclump.h
index 18148b215..2411cb713 100644
--- a/src/unclump.h
+++ b/src/unclump.h
@@ -11,7 +11,7 @@
#ifndef SEEN_DIALOGS_UNCLUMP_H
#define SEEN_DIALOGS_UNCLUMP_H
-#include <glib.h>
+typedef struct _GSList GSList;
void unclump(GSList *items);
diff --git a/src/unicoderange.h b/src/unicoderange.h
index 2f73f7b47..342b3fa3e 100644
--- a/src/unicoderange.h
+++ b/src/unicoderange.h
@@ -1,17 +1,19 @@
#include <glibmm/ustring.h>
-#include <glib-object.h>
#include <vector>
+// A type which can hold any UTF-32 or UCS-4 character code.
+typedef unsigned int gunichar;
+
struct Urange{
- gchar* start;
- gchar* end;
+ char* start;
+ char* end;
};
class UnicodeRange{
public:
-UnicodeRange(const gchar* val);
-int add_range(gchar* val);
-bool contains(gchar unicode);
+UnicodeRange(const char* val);
+int add_range(char* val);
+bool contains(char unicode);
Glib::ustring attribute_string();
gunichar sample_glyph();
diff --git a/src/uri-references.cpp b/src/uri-references.cpp
index 6db2ed21f..b23bed74a 100644
--- a/src/uri-references.cpp
+++ b/src/uri-references.cpp
@@ -1,6 +1,4 @@
-#define __SP_URI_REFERENCES_C__
-
-/*
+/**
* Helper methods for resolving URI References
*
* Authors:
@@ -206,4 +204,4 @@ sp_uri_reference_resolve (SPDocument *document, const gchar *uri)
fill-column:99
End:
*/
-// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8 :
diff --git a/src/uri-references.h b/src/uri-references.h
index 631d440da..0c51481cc 100644
--- a/src/uri-references.h
+++ b/src/uri-references.h
@@ -14,7 +14,7 @@
* Released under GNU GPL, read the file 'COPYING' for more information
*/
-#include <stddef.h>
+#include <cstddef>
#include <sigc++/connection.h>
#include <sigc++/trackable.h>
@@ -62,7 +62,7 @@ public:
* @param rel_document document for relative URIs
* @param uri the URI to watch
*/
- void attach(const URI &uri) throw(BadURIException);
+ void attach(URI const& uri) throw(BadURIException);
/**
* Detaches from the currently attached URI target, if any;
@@ -105,7 +105,7 @@ public:
*
* @returns the currently attached URI, or NULL
*/
- const URI *getURI() const {
+ URI const* getURI() const {
return _uri;
}
@@ -140,7 +140,7 @@ private:
void _setObject(SPObject *object);
void _release(SPObject *object);
- void operator=(const URIReference &ref);
+ void operator=(URIReference const& ref);
/* Private and definition-less to prevent accidental use. */
};
@@ -149,9 +149,9 @@ private:
/**
* Resolves an item referenced by a URI in CSS form contained in "url(...)"
*/
-SPObject* sp_css_uri_reference_resolve( SPDocument *document, const gchar *uri );
+SPObject* sp_css_uri_reference_resolve( SPDocument *document, const char *uri );
-SPObject *sp_uri_reference_resolve (SPDocument *document, const gchar *uri);
+SPObject *sp_uri_reference_resolve (SPDocument *document, const char *uri);
#endif // SEEN_SP_URI_REFERENCES_H
@@ -164,4 +164,4 @@ SPObject *sp_uri_reference_resolve (SPDocument *document, const gchar *uri);
fill-column:99
End:
*/
-// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8 :
diff --git a/src/uri.h b/src/uri.h
index c6c2264cc..cee1baa09 100644
--- a/src/uri.h
+++ b/src/uri.h
@@ -11,7 +11,6 @@
#ifndef INKSCAPE_URI_H
#define INKSCAPE_URI_H
-#include <glib.h>
#include <exception>
#include <libxml/uri.h>
#include "bad-uri-exception.h"
@@ -38,7 +37,7 @@ public:
*
* @param preformed Properly quoted C-style string to be represented.
*/
- explicit URI(gchar const *preformed) throw(BadURIException);
+ explicit URI(char const *preformed) throw(BadURIException);
/**
* Destructor.
@@ -89,25 +88,25 @@ public:
*/
bool isAbsolutePath() const { return _impl->isAbsolutePath(); }
- const gchar *getScheme() const { return _impl->getScheme(); }
+ const char *getScheme() const { return _impl->getScheme(); }
- const gchar *getPath() const { return _impl->getPath(); }
+ const char *getPath() const { return _impl->getPath(); }
- const gchar *getQuery() const { return _impl->getQuery(); }
+ const char *getQuery() const { return _impl->getQuery(); }
- const gchar *getFragment() const { return _impl->getFragment(); }
+ const char *getFragment() const { return _impl->getFragment(); }
- const gchar *getOpaque() const { return _impl->getOpaque(); }
+ const char *getOpaque() const { return _impl->getOpaque(); }
- static URI fromUtf8( gchar const* path ) throw (BadURIException);
+ static URI fromUtf8( char const* path ) throw (BadURIException);
- static URI from_native_filename(gchar const *path) throw(BadURIException);
+ static URI from_native_filename(char const *path) throw(BadURIException);
- static gchar *to_native_filename(gchar const* uri) throw(BadURIException);
+ static char *to_native_filename(char const* uri) throw(BadURIException);
const std::string getFullPath(std::string const base) const;
- gchar *toNativeFilename() const throw(BadURIException);
+ char *toNativeFilename() const throw(BadURIException);
/**
* Returns a glib string version of this URI.
@@ -116,7 +115,7 @@ public:
*
* @return a glib string version of this URI.
*/
- gchar *toString() const { return _impl->toString(); }
+ char *toString() const { return _impl->toString(); }
/**
* Assignment operator.
@@ -135,12 +134,12 @@ private:
bool isNetPath() const;
bool isRelativePath() const;
bool isAbsolutePath() const;
- const gchar *getScheme() const;
- const gchar *getPath() const;
- const gchar *getQuery() const;
- const gchar *getFragment() const;
- const gchar *getOpaque() const;
- gchar *toString() const;
+ const char *getScheme() const;
+ const char *getPath() const;
+ const char *getQuery() const;
+ const char *getFragment() const;
+ const char *getOpaque() const;
+ char *toString() const;
private:
Impl(xmlURIPtr uri);
~Impl();
diff --git a/src/vanishing-point.cpp b/src/vanishing-point.cpp
index 2b419da70..13dd03ee3 100644
--- a/src/vanishing-point.cpp
+++ b/src/vanishing-point.cpp
@@ -23,7 +23,7 @@
#include "ui/tools/tool-base.h"
#include "xml/repr.h"
#include "perspective-line.h"
-#include "shape-editor.h"
+#include "ui/shape-editor.h"
#include "snap.h"
#include "sp-namedview.h"
#include "ui/control-manager.h"
diff --git a/src/vanishing-point.h b/src/vanishing-point.h
index ca34d9118..7242a94ee 100644
--- a/src/vanishing-point.h
+++ b/src/vanishing-point.h
@@ -12,8 +12,10 @@
#ifndef SEEN_VANISHING_POINT_H
#define SEEN_VANISHING_POINT_H
-#include <set>
#include <2geom/point.h>
+#include <list>
+#include <set>
+
#include "knot.h"
#include "selection.h"
#include "persp3d.h"
@@ -21,6 +23,8 @@
#include "ui/control-manager.h" // TODO break enums out separately
class SPBox3D;
+typedef struct _GList GList;
+typedef struct _GSList GSList;
namespace Box3D {
@@ -101,7 +105,7 @@ public:
g_return_if_fail (_persp);
persp3d_get_VP (_persp, _axis).print("");
}
- inline gchar const *axisString () { return Proj::string_from_axis(_axis); }
+ inline char const *axisString () { return Proj::string_from_axis(_axis); }
unsigned int my_counter;
static unsigned int global_counter; // FIXME: Only to implement operator< so that we can merge lists. Do this in a better way!!
@@ -140,7 +144,7 @@ public:
void updateTip();
- guint numberOfBoxes(); // the number of boxes linked to all VPs of the dragger
+ unsigned int numberOfBoxes(); // the number of boxes linked to all VPs of the dragger
VanishingPoint *findVPWithBox(SPBox3D *box);
std::set<VanishingPoint*, less_ptr> VPsOfSelectedBoxes();
@@ -185,7 +189,7 @@ public:
void updateBoxDisplays ();
void drawLinesForFace (const SPBox3D *box, Proj::Axis axis); //, guint corner1, guint corner2, guint corner3, guint corner4);
bool show_lines; /* whether perspective lines are drawn at all */
- guint front_or_rear_lines; /* whether we draw perspective lines from all corners or only the
+ unsigned int front_or_rear_lines; /* whether we draw perspective lines from all corners or only the
front/rear corners (indicated by the first/second bit, respectively */
diff --git a/src/verbs.cpp b/src/verbs.cpp
index 4f2783866..b4743751e 100644
--- a/src/verbs.cpp
+++ b/src/verbs.cpp
@@ -53,7 +53,7 @@
#include "helper/action-context.h"
#include "help.h"
#include "inkscape-private.h"
-#include "interface.h"
+#include "ui/interface.h"
#include "layer-fns.h"
#include "layer-manager.h"
#include "message-stack.h"
@@ -62,14 +62,15 @@
#include "ui/tools/select-tool.h"
#include "selection-chemistry.h"
#include "seltrans.h"
-#include "shape-editor.h"
+#include "ui/shape-editor.h"
#include "shortcuts.h"
+#include "sp-defs.h"
#include "sp-flowtext.h"
#include "sp-guide.h"
#include "splivarot.h"
#include "sp-namedview.h"
#include "text-chemistry.h"
-#include "tools-switch.h"
+#include "ui/tools-switch.h"
#include "ui/dialog/align-and-distribute.h"
#include "ui/dialog/clonetiler.h"
#include "ui/dialog/dialog-manager.h"
@@ -215,6 +216,25 @@ public:
}; // ObjectVerb class
/**
+ * A class to encompass all of the verbs which deal with operations related to tags.
+ */
+class TagVerb : public Verb {
+private:
+ static void perform(SPAction *action, void *mydata);
+protected:
+ virtual SPAction *make_action(Inkscape::ActionContext const & context);
+public:
+ /** Use the Verb initializer with the same parameters. */
+ TagVerb(unsigned int const code,
+ gchar const *id,
+ gchar const *name,
+ gchar const *tip,
+ gchar const *image) :
+ Verb(code, id, name, tip, image, _("Tag"))
+ { }
+}; // TagVerb class
+
+/**
* A class to encompass all of the verbs which deal with operations relative to context.
*/
class ContextVerb : public Verb {
@@ -460,6 +480,19 @@ SPAction *ObjectVerb::make_action(Inkscape::ActionContext const & context)
}
/**
+ * Create an action for a \c TagVerb.
+ *
+ * Calls \c make_action_helper with the \c vector.
+ *
+ * @param view Which view the action should be created for.
+ * @return The built action.
+ */
+SPAction *TagVerb::make_action(Inkscape::ActionContext const & context)
+{
+ return make_action_helper(context, &perform);
+}
+
+/**
* Create an action for a \c ContextVerb.
*
* Calls \c make_action_helper with the \c vector.
@@ -1535,6 +1568,9 @@ void ObjectVerb::perform( SPAction *action, void *data)
case SP_VERB_OBJECT_SET_CLIPPATH:
sp_selection_set_mask(dt, true, false);
break;
+ case SP_VERB_OBJECT_CREATE_CLIP_GROUP:
+ sp_selection_set_clipgroup(dt);
+ break;
case SP_VERB_OBJECT_EDIT_CLIPPATH:
sp_selection_edit_clip_or_mask(dt, true);
break;
@@ -1550,6 +1586,47 @@ void ObjectVerb::perform( SPAction *action, void *data)
/**
* Decode the verb code and take appropriate action.
*/
+void TagVerb::perform( SPAction *action, void *data)
+{
+ SPDesktop *dt = static_cast<SPDesktop*>(sp_action_get_view(action));
+ if (!dt)
+ return;
+
+ //Inkscape::UI::Tools::ToolBase *ec = dt->event_context;
+
+ Inkscape::Selection *sel = sp_desktop_selection(dt);
+
+ Inkscape::XML::Document * doc;
+ Inkscape::XML::Node * repr;
+ gchar *id;
+
+ switch (reinterpret_cast<std::size_t>(data)) {
+ case SP_VERB_TAG_NEW:
+ static int tag_suffix=1;
+ id=NULL;
+ do {
+ g_free(id);
+ id = g_strdup_printf("Set %d", tag_suffix++);
+ } while (dt->doc()->getObjectById(id));
+
+ doc = dt->doc()->getReprDoc();
+ repr = doc->createElement("inkscape:tag");
+ repr->setAttribute("id", id);
+ g_free(id);
+
+ dt->doc()->getDefs()->addChild(repr, NULL);
+ Inkscape::DocumentUndo::done(dt->doc(), SP_VERB_DIALOG_TAGS, _("Create new selection set"));
+ break;
+ default:
+ break;
+ }
+
+} // end of sp_verb_action_tag_perform()
+
+
+/**
+ * Decode the verb code and take appropriate action.
+ */
void ContextVerb::perform(SPAction *action, void *data)
{
SPDesktop *dt;
@@ -2037,6 +2114,12 @@ void DialogVerb::perform(SPAction *action, void *data)
case SP_VERB_DIALOG_LAYERS:
dt->_dlg_mgr->showDialog("LayersPanel");
break;
+ case SP_VERB_DIALOG_OBJECTS:
+ dt->_dlg_mgr->showDialog("ObjectsPanel");
+ break;
+ case SP_VERB_DIALOG_TAGS:
+ dt->_dlg_mgr->showDialog("TagsPanel");
+ break;
case SP_VERB_DIALOG_LIVE_PATH_EFFECT:
dt->_dlg_mgr->showDialog("LivePathEffect");
break;
@@ -2637,11 +2720,15 @@ Verb *Verb::_base_verbs[] = {
N_("Remove mask from selection"), NULL),
new ObjectVerb(SP_VERB_OBJECT_SET_CLIPPATH, "ObjectSetClipPath", N_("_Set"),
N_("Apply clipping path to selection (using the topmost object as clipping path)"), NULL),
+ new ObjectVerb(SP_VERB_OBJECT_CREATE_CLIP_GROUP, "ObjectCreateClipGroup", N_("Create Cl_ip Group"),
+ N_("Creates a clip group using the selected objects as a base"), NULL),
new ObjectVerb(SP_VERB_OBJECT_EDIT_CLIPPATH, "ObjectEditClipPath", N_("_Edit"),
N_("Edit clipping path"), INKSCAPE_ICON("path-clip-edit")),
new ObjectVerb(SP_VERB_OBJECT_UNSET_CLIPPATH, "ObjectUnSetClipPath", N_("_Release"),
N_("Remove clipping path from selection"), NULL),
-
+ // Tag
+ new TagVerb(SP_VERB_TAG_NEW, "TagNew", N_("_New"),
+ N_("Create new selection set"), NULL),
// Tools
new ContextVerb(SP_VERB_CONTEXT_SELECT, "ToolSelector", NC_("ContextVerb", "Select"),
N_("Select and transform objects"), INKSCAPE_ICON("tool-pointer")),
@@ -2854,6 +2941,10 @@ Verb *Verb::_base_verbs[] = {
N_("Query information about extensions"), NULL),
new DialogVerb(SP_VERB_DIALOG_LAYERS, "DialogLayers", N_("Layer_s..."),
N_("View Layers"), INKSCAPE_ICON("dialog-layers")),
+ new DialogVerb(SP_VERB_DIALOG_OBJECTS, "DialogObjects", N_("Object_s..."),
+ N_("View Objects"), INKSCAPE_ICON("dialog-layers")),
+ new DialogVerb(SP_VERB_DIALOG_TAGS, "DialogTags", N_("Selection se_ts..."),
+ N_("View Tags"), INKSCAPE_ICON("edit-select-all-layers")),
new DialogVerb(SP_VERB_DIALOG_LIVE_PATH_EFFECT, "DialogLivePathEffect", N_("Path E_ffects ..."),
N_("Manage, edit, and apply path effects"), NULL),
new DialogVerb(SP_VERB_DIALOG_FILTER_EFFECTS, "DialogFilterEffects", N_("Filter _Editor..."),
diff --git a/src/verbs.h b/src/verbs.h
index 6ad4d0fee..06fc4fb05 100644
--- a/src/verbs.h
+++ b/src/verbs.h
@@ -13,10 +13,13 @@
* This code is GPL if done by Ted or David
*/
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
#include <cstring>
#include <string>
-#include "config.h"
-#include "require-config.h" /* HAVE_GTK_WINDOW_FULLSCREEN */
+//#include "require-config.h" /* HAVE_GTK_WINDOW_FULLSCREEN */
#include <glibmm/ustring.h>
struct SPAction;
@@ -175,8 +178,11 @@ enum {
SP_VERB_OBJECT_EDIT_MASK,
SP_VERB_OBJECT_UNSET_MASK,
SP_VERB_OBJECT_SET_CLIPPATH,
+ SP_VERB_OBJECT_CREATE_CLIP_GROUP,
SP_VERB_OBJECT_EDIT_CLIPPATH,
SP_VERB_OBJECT_UNSET_CLIPPATH,
+ /* Tag */
+ SP_VERB_TAG_NEW,
/* Tools */
SP_VERB_CONTEXT_SELECT,
SP_VERB_CONTEXT_NODE,
@@ -289,6 +295,8 @@ enum {
SP_VERB_DIALOG_INPUT,
SP_VERB_DIALOG_EXTENSIONEDITOR,
SP_VERB_DIALOG_LAYERS,
+ SP_VERB_DIALOG_OBJECTS,
+ SP_VERB_DIALOG_TAGS,
SP_VERB_DIALOG_LIVE_PATH_EFFECT,
SP_VERB_DIALOG_FILTER_EFFECTS,
SP_VERB_DIALOG_SVG_FONTS,
@@ -347,7 +355,7 @@ enum {
SP_VERB_LAST
};
-gchar *sp_action_get_title (const SPAction *action);
+char *sp_action_get_title (const SPAction *action);
#include <map>
#include <vector>
@@ -399,20 +407,20 @@ private:
ActionTable * _actions;
/** A unique textual ID for the verb. */
- gchar const * _id;
+ char const * _id;
/** The full name of the verb. (shown on menu entries) */
- gchar const * _name;
+ char const * _name;
/** Tooltip for the verb. */
- gchar const * _tip;
+ char const * _tip;
- gchar * _full_tip; // includes shortcut
+ char * _full_tip; // includes shortcut
unsigned int _shortcut;
/** Name of the image that represents the verb. */
- gchar const * _image;
+ char const * _image;
/**
* Unique numerical representation of the verb. In most cases
@@ -422,7 +430,7 @@ private:
unsigned int _code;
/** Name of the group the verb belongs to. */
- gchar const * _group;
+ char const * _group;
/**
* Whether this verb is set to default to sensitive or
@@ -452,28 +460,28 @@ public:
unsigned int get_code (void) { return _code; }
/** Accessor to get the internal variable. */
- gchar const * get_id (void) { return _id; }
+ char const * get_id (void) { return _id; }
/** Accessor to get the internal variable. */
- gchar const * get_name (void) { return _name; }
+ char const * get_name (void) { return _name; }
/** Accessor to get the internal variable. */
- gchar const * get_short_tip (void) { return _tip; };
+ char const * get_short_tip (void) { return _tip; };
/** Accessor to get the internal variable. */
- gchar const * get_tip (void) ;
+ char const * get_tip (void) ;
/** Accessor to get the internal variable. */
- gchar const * get_image (void) { return _image; }
+ char const * get_image (void) { return _image; }
/** Get the verbs group */
- gchar const * get_group (void) { return _group; }
+ char const * get_group (void) { return _group; }
/** Set the name after initialization. */
- gchar const * set_name (gchar const * name) { _name = name; return _name; }
+ char const * set_name (char const * name) { _name = name; return _name; }
/** Set the tooltip after initialization. */
- gchar const * set_tip (gchar const * tip) { _tip = tip; return _tip; }
+ char const * set_tip (char const * tip) { _tip = tip; return _tip; }
protected:
@@ -504,11 +512,11 @@ public:
* @param image Goes to \c _image.
*/
Verb(const unsigned int code,
- gchar const * id,
- gchar const * name,
- gchar const * tip,
- gchar const * image,
- gchar const * group) :
+ char const * id,
+ char const * name,
+ char const * tip,
+ char const * image,
+ char const * group) :
_actions(0),
_id(id),
_name(name),
@@ -523,7 +531,7 @@ public:
_verbs.insert(VerbTable::value_type(_code, this));
_verb_ids.insert(VerbIDTable::value_type(_id, this));
}
- Verb (gchar const * id, gchar const * name, gchar const * tip, gchar const * image, gchar const * group);
+ Verb (char const * id, char const * name, char const * tip, char const * image, char const * group);
virtual ~Verb (void);
SPAction * get_action(Inkscape::ActionContext const & context);
diff --git a/src/version.cpp b/src/version.cpp
index 68729c62e..abe855ee7 100644
--- a/src/version.cpp
+++ b/src/version.cpp
@@ -12,14 +12,14 @@
* Released under GNU GPL, read the file 'COPYING' for more information
*/
+#include <glib.h>
#include <sstream>
-
#include "version.h"
-gboolean sp_version_from_string(const gchar *string, Inkscape::Version *version)
+bool sp_version_from_string(const char *string, Inkscape::Version *version)
{
if (!string) {
- return FALSE;
+ return false;
}
try
@@ -40,27 +40,27 @@ gboolean sp_version_from_string(const gchar *string, Inkscape::Version *version)
}
}
-gchar *sp_version_to_string(Inkscape::Version version)
+char *sp_version_to_string(Inkscape::Version version)
{
return g_strdup_printf("%u.%u", version._major, version._minor);
}
-gboolean sp_version_inside_range(Inkscape::Version version,
- unsigned major_min, unsigned minor_min,
- unsigned major_max, unsigned minor_max)
+bool sp_version_inside_range(Inkscape::Version version,
+ unsigned major_min, unsigned minor_min,
+ unsigned major_max, unsigned minor_max)
{
if ( version._major < major_min || version._major > major_max ) {
- return FALSE;
+ return false;
} else if ( version._major == major_min &&
version._minor <= minor_min )
{
- return FALSE;
+ return false;
} else if ( version._major == major_max &&
version._minor >= minor_max )
{
- return FALSE;
+ return false;
} else {
- return TRUE;
+ return true;
}
}
diff --git a/src/version.h b/src/version.h
index 26fbc11a3..e17688b6d 100644
--- a/src/version.h
+++ b/src/version.h
@@ -11,8 +11,6 @@
#ifndef SEEN_INKSCAPE_VERSION_H
#define SEEN_INKSCAPE_VERSION_H
-#include <glib.h>
-
#define SVG_VERSION "1.1"
namespace Inkscape {
@@ -49,13 +47,13 @@ public:
}
-gboolean sp_version_from_string(const gchar *string, Inkscape::Version *version);
+bool sp_version_from_string(const char *string, Inkscape::Version *version);
-gchar *sp_version_to_string(Inkscape::Version version);
+char *sp_version_to_string(Inkscape::Version version);
-gboolean sp_version_inside_range(Inkscape::Version version,
- unsigned major_min, unsigned minor_min,
- unsigned major_max, unsigned minor_max);
+bool sp_version_inside_range(Inkscape::Version version,
+ unsigned major_min, unsigned minor_min,
+ unsigned major_max, unsigned minor_max);
#endif // SEEN_INKSCAPE_VERSION_H
/*
diff --git a/src/widgets/CMakeLists.txt b/src/widgets/CMakeLists.txt
index fe4433153..072b905a2 100644
--- a/src/widgets/CMakeLists.txt
+++ b/src/widgets/CMakeLists.txt
@@ -24,6 +24,9 @@ set(widgets_SRC
desktop-widget.cpp
eek-preview.cpp
ege-paint-def.cpp
+ ege-adjustment-action.cpp
+ ege-output-action.cpp
+ ege-select-one-action.cpp
fill-style.cpp
font-selector.cpp
gradient-image.cpp
@@ -31,6 +34,8 @@ set(widgets_SRC
gradient-toolbar.cpp
gradient-vector.cpp
icon.cpp
+ ink-action.cpp
+ ink-comboboxentry-action.cpp
paint-selector.cpp
ruler.cpp
select-toolbar.cpp
@@ -80,6 +85,9 @@ set(widgets_SRC
desktop-widget.h
eek-preview.h
ege-paint-def.h
+ ege-adjustment-action.h
+ ege-output-action.h
+ ege-select-one-action.h
fill-n-stroke-factory.h
fill-style.h
font-selector.h
@@ -88,6 +96,8 @@ set(widgets_SRC
gradient-toolbar.h
gradient-vector.h
icon.h
+ ink-action.h
+ ink-comboboxentry-action.h
paint-selector.h
ruler.h
select-toolbar.h
diff --git a/src/widgets/Makefile_insert b/src/widgets/Makefile_insert
index 97713cbee..dc4c12967 100644
--- a/src/widgets/Makefile_insert
+++ b/src/widgets/Makefile_insert
@@ -19,8 +19,14 @@ ink_common_sources += \
widgets/dropper-toolbar.h \
widgets/eek-preview.cpp \
widgets/eek-preview.h \
+ widgets/ege-adjustment-action.cpp \
+ widgets/ege-adjustment-action.h \
widgets/ege-paint-def.cpp \
widgets/ege-paint-def.h \
+ widgets/ege-output-action.cpp \
+ widgets/ege-output-action.h \
+ widgets/ege-select-one-action.cpp \
+ widgets/ege-select-one-action.h \
widgets/eraser-toolbar.cpp \
widgets/eraser-toolbar.h \
widgets/fill-style.cpp \
@@ -38,6 +44,10 @@ ink_common_sources += \
widgets/gradient-vector.h \
widgets/icon.cpp \
widgets/icon.h \
+ widgets/ink-action.cpp \
+ widgets/ink-action.h \
+ widgets/ink-comboboxentry-action.cpp \
+ widgets/ink-comboboxentry-action.h \
widgets/lpe-toolbar.cpp \
widgets/lpe-toolbar.h \
widgets/measure-toolbar.cpp \
diff --git a/src/widgets/arc-toolbar.cpp b/src/widgets/arc-toolbar.cpp
index ca6810c81..ca582924b 100644
--- a/src/widgets/arc-toolbar.cpp
+++ b/src/widgets/arc-toolbar.cpp
@@ -34,10 +34,10 @@
#include "desktop-handles.h"
#include "desktop.h"
#include "document-undo.h"
-#include "ege-adjustment-action.h"
-#include "ege-output-action.h"
-#include "ege-select-one-action.h"
-#include "ink-action.h"
+#include "widgets/ege-adjustment-action.h"
+#include "widgets/ege-output-action.h"
+#include "widgets/ege-select-one-action.h"
+#include "widgets/ink-action.h"
#include "mod360.h"
#include "preferences.h"
#include "selection.h"
@@ -45,6 +45,7 @@
#include "toolbox.h"
#include "ui/icon-names.h"
#include "ui/uxmanager.h"
+#include "ui/tools/arc-tool.h"
#include "verbs.h"
#include "widgets/spinbutton-events.h"
#include "xml/node-event-vector.h"
@@ -304,6 +305,7 @@ static void sp_arc_toolbox_selection_changed(Inkscape::Selection *selection, GOb
}
}
+static void arc_toolbox_check_ec(SPDesktop* dt, Inkscape::UI::Tools::ToolBase* ec, GObject* holder);
void sp_arc_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainActions, GObject* holder)
{
@@ -402,14 +404,22 @@ void sp_arc_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainActions, GObjec
sp_arctb_sensitivize( holder, gtk_adjustment_get_value(adj1), gtk_adjustment_get_value(adj2) );
}
-
- sigc::connection *connection = new sigc::connection(
- sp_desktop_selection(desktop)->connectChanged(sigc::bind(sigc::ptr_fun(sp_arc_toolbox_selection_changed), G_OBJECT(holder)))
- );
- g_signal_connect( holder, "destroy", G_CALLBACK(delete_connection), connection );
+ desktop->connectEventContextChanged(sigc::bind(sigc::ptr_fun(arc_toolbox_check_ec), holder));
g_signal_connect( holder, "destroy", G_CALLBACK(purge_repr_listener), holder );
}
+static void arc_toolbox_check_ec(SPDesktop* desktop, Inkscape::UI::Tools::ToolBase* ec, GObject* holder)
+{
+ static sigc::connection changed;
+
+ if (SP_IS_ARC_CONTEXT(ec)) {
+ changed = sp_desktop_selection(desktop)->connectChanged(sigc::bind(sigc::ptr_fun(sp_arc_toolbox_selection_changed), holder));
+ sp_arc_toolbox_selection_changed(sp_desktop_selection(desktop), holder);
+ } else {
+ if (changed)
+ changed.disconnect();
+ }
+}
/*
Local Variables:
diff --git a/src/widgets/box3d-toolbar.cpp b/src/widgets/box3d-toolbar.cpp
index 3b13cd2cf..02d102a11 100644
--- a/src/widgets/box3d-toolbar.cpp
+++ b/src/widgets/box3d-toolbar.cpp
@@ -36,13 +36,14 @@
#include "desktop.h"
#include "document-undo.h"
#include "document.h"
-#include "ege-adjustment-action.h"
-#include "ink-action.h"
+#include "widgets/ege-adjustment-action.h"
+#include "widgets/ink-action.h"
#include "inkscape.h"
#include "persp3d.h"
#include "selection.h"
#include "toolbox.h"
#include "ui/icon-names.h"
+#include "ui/tools/box3d-tool.h"
#include "ui/uxmanager.h"
#include "verbs.h"
#include "xml/node-event-vector.h"
@@ -280,6 +281,8 @@ static void box3d_vp_z_state_changed( GtkToggleAction *act, GtkAction *box3d_ang
box3d_vp_state_changed(act, box3d_angle, Proj::Z);
}
+static void box3d_toolbox_check_ec(SPDesktop* dt, Inkscape::UI::Tools::ToolBase* ec, GObject* holder);
+
void box3d_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainActions, GObject* holder)
{
Inkscape::Preferences *prefs = Inkscape::Preferences::get();
@@ -409,13 +412,22 @@ void box3d_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainActions, GObject
gtk_toggle_action_set_active( GTK_TOGGLE_ACTION(act), prefs->getBool("/tools/shapes/3dbox/vp_z_state", true) );
}
- sigc::connection *connection = new sigc::connection(
- sp_desktop_selection(desktop)->connectChanged(sigc::bind(sigc::ptr_fun(box3d_toolbox_selection_changed), G_OBJECT(holder)))
- );
- g_signal_connect(holder, "destroy", G_CALLBACK(delete_connection), connection);
+ desktop->connectEventContextChanged(sigc::bind(sigc::ptr_fun(box3d_toolbox_check_ec), holder));
g_signal_connect(holder, "destroy", G_CALLBACK(purge_repr_listener), holder);
}
+static void box3d_toolbox_check_ec(SPDesktop* desktop, Inkscape::UI::Tools::ToolBase* ec, GObject* holder)
+{
+ static sigc::connection changed;
+ if (SP_IS_BOX3D_CONTEXT(ec)) {
+ changed = sp_desktop_selection(desktop)->connectChanged(sigc::bind(sigc::ptr_fun(box3d_toolbox_selection_changed), holder));
+ box3d_toolbox_selection_changed(sp_desktop_selection(desktop), holder);
+ } else {
+ if (changed)
+ changed.disconnect();
+ }
+}
+
/*
Local Variables:
mode:c++
diff --git a/src/widgets/button.cpp b/src/widgets/button.cpp
index a1bd9b792..1776e28c4 100644
--- a/src/widgets/button.cpp
+++ b/src/widgets/button.cpp
@@ -1,6 +1,4 @@
-#define __SP_BUTTON_C__
-
-/*
+/**
* Generic button widget
*
* Authors:
@@ -13,282 +11,257 @@
* This code is in public domain
*/
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif
-
+#include <glibmm.h>
#include "icon.h"
-#include "shortcuts.h"
-#include "interface.h"
+
+#include "button.h"
#include "helper/action-context.h"
+#include "ui/interface.h"
+#include "shortcuts.h"
+#include "helper/action.h"
#include <gdk/gdkkeysyms.h>
-#include "button.h"
-
static void sp_button_dispose(GObject *object);
-#if GTK_CHECK_VERSION(3,0,0)
-static void sp_button_get_preferred_width(GtkWidget *widget,
- gint *minimal_width,
- gint *natural_width);
+#if GTK_CHECK_VERSION(3, 0, 0)
+static void sp_button_get_preferred_width(GtkWidget *widget, gint *minimal_width, gint *natural_width);
-static void sp_button_get_preferred_height(GtkWidget *widget,
- gint *minimal_height,
- gint *natural_height);
+static void sp_button_get_preferred_height(GtkWidget *widget, gint *minimal_height, gint *natural_height);
#else
-static void sp_button_size_request (GtkWidget *widget, GtkRequisition *requisition);
+static void sp_button_size_request(GtkWidget *widget, GtkRequisition *requisition);
#endif
-static void sp_button_clicked (GtkButton *button);
-static void sp_button_perform_action (SPButton *button, gpointer data);
-static gint sp_button_process_event (SPButton *button, GdkEvent *event);
+static void sp_button_clicked(GtkButton *button);
+static void sp_button_perform_action(SPButton *button, gpointer data);
+static gint sp_button_process_event(SPButton *button, GdkEvent *event);
-static void sp_button_set_action (SPButton *button, SPAction *action);
-static void sp_button_set_doubleclick_action (SPButton *button, SPAction *action);
-static void sp_button_action_set_active (SPButton *button, bool active);
-static void sp_button_set_composed_tooltip (GtkWidget *widget, SPAction *action);
+static void sp_button_set_action(SPButton *button, SPAction *action);
+static void sp_button_set_doubleclick_action(SPButton *button, SPAction *action);
+static void sp_button_action_set_active(SPButton *button, bool active);
+static void sp_button_set_composed_tooltip(GtkWidget *widget, SPAction *action);
G_DEFINE_TYPE(SPButton, sp_button, GTK_TYPE_TOGGLE_BUTTON);
-static void
-sp_button_class_init (SPButtonClass *klass)
+static void sp_button_class_init(SPButtonClass *klass)
{
- GObjectClass *object_class=G_OBJECT_CLASS(klass);
- GtkWidgetClass *widget_class=GTK_WIDGET_CLASS(klass);
- GtkButtonClass *button_class=GTK_BUTTON_CLASS(klass);
-
- object_class->dispose = sp_button_dispose;
-#if GTK_CHECK_VERSION(3,0,0)
- widget_class->get_preferred_width = sp_button_get_preferred_width;
- widget_class->get_preferred_height = sp_button_get_preferred_height;
+ GObjectClass *object_class = G_OBJECT_CLASS(klass);
+ GtkWidgetClass *widget_class = GTK_WIDGET_CLASS(klass);
+ GtkButtonClass *button_class = GTK_BUTTON_CLASS(klass);
+
+ object_class->dispose = sp_button_dispose;
+#if GTK_CHECK_VERSION(3, 0, 0)
+ widget_class->get_preferred_width = sp_button_get_preferred_width;
+ widget_class->get_preferred_height = sp_button_get_preferred_height;
#else
- widget_class->size_request = sp_button_size_request;
+ widget_class->size_request = sp_button_size_request;
#endif
- button_class->clicked = sp_button_clicked;
+ button_class->clicked = sp_button_clicked;
}
-static void
-sp_button_init (SPButton *button)
+static void sp_button_init(SPButton *button)
{
- button->action = NULL;
- button->doubleclick_action = NULL;
- new (&button->c_set_active) sigc::connection();
- new (&button->c_set_sensitive) sigc::connection();
+ button->action = NULL;
+ button->doubleclick_action = NULL;
+ new (&button->c_set_active) sigc::connection();
+ new (&button->c_set_sensitive) sigc::connection();
- gtk_container_set_border_width (GTK_CONTAINER (button), 0);
+ gtk_container_set_border_width(GTK_CONTAINER(button), 0);
- gtk_widget_set_can_focus (GTK_WIDGET (button), FALSE);
- gtk_widget_set_can_default (GTK_WIDGET (button), FALSE);
+ gtk_widget_set_can_focus(GTK_WIDGET(button), FALSE);
+ gtk_widget_set_can_default(GTK_WIDGET(button), FALSE);
- g_signal_connect_after (G_OBJECT (button), "clicked", G_CALLBACK (sp_button_perform_action), NULL);
- g_signal_connect_after (G_OBJECT (button), "event", G_CALLBACK (sp_button_process_event), NULL);
+ g_signal_connect_after(G_OBJECT(button), "clicked", G_CALLBACK(sp_button_perform_action), NULL);
+ g_signal_connect_after(G_OBJECT(button), "event", G_CALLBACK(sp_button_process_event), NULL);
}
static void sp_button_dispose(GObject *object)
{
- SPButton *button = SP_BUTTON (object);
+ SPButton *button = SP_BUTTON(object);
- if (button->action) {
- sp_button_set_action (button, NULL);
- }
- if (button->doubleclick_action) {
- sp_button_set_doubleclick_action (button, NULL);
- }
+ if (button->action) {
+ sp_button_set_action(button, NULL);
+ }
+ if (button->doubleclick_action) {
+ sp_button_set_doubleclick_action(button, NULL);
+ }
- button->c_set_active.~connection();
- button->c_set_sensitive.~connection();
+ button->c_set_active.~connection();
+ button->c_set_sensitive.~connection();
- (G_OBJECT_CLASS(sp_button_parent_class))->dispose(object);
+ (G_OBJECT_CLASS(sp_button_parent_class))->dispose(object);
}
-
-
-#if GTK_CHECK_VERSION(3,0,0)
+#if GTK_CHECK_VERSION(3, 0, 0)
static void sp_button_get_preferred_width(GtkWidget *widget, gint *minimal_width, gint *natural_width)
{
- GtkWidget *child = gtk_bin_get_child(GTK_BIN (widget));
- GtkStyle *style = gtk_widget_get_style(widget);
-
- if (child) {
- gtk_widget_get_preferred_width(GTK_WIDGET(child), minimal_width, natural_width);
- } else {
- *minimal_width = 0;
- *natural_width = 0;
- }
-
- *minimal_width += 2 + 2 * MAX(2, style->xthickness);
- *natural_width += 2 + 2 * MAX(2, style->xthickness);
+ GtkWidget *child = gtk_bin_get_child(GTK_BIN(widget));
+ GtkStyle *style = gtk_widget_get_style(widget);
+
+ if (child) {
+ gtk_widget_get_preferred_width(GTK_WIDGET(child), minimal_width, natural_width);
+ } else {
+ *minimal_width = 0;
+ *natural_width = 0;
+ }
+
+ *minimal_width += 2 + 2 * MAX(2, style->xthickness);
+ *natural_width += 2 + 2 * MAX(2, style->xthickness);
}
static void sp_button_get_preferred_height(GtkWidget *widget, gint *minimal_height, gint *natural_height)
{
- GtkWidget *child = gtk_bin_get_child(GTK_BIN (widget));
- GtkStyle *style = gtk_widget_get_style(widget);
-
- if (child) {
- gtk_widget_get_preferred_height(GTK_WIDGET(child), minimal_height, natural_height);
- } else {
- *minimal_height = 0;
- *natural_height = 0;
- }
+ GtkWidget *child = gtk_bin_get_child(GTK_BIN(widget));
+ GtkStyle *style = gtk_widget_get_style(widget);
- *minimal_height += 2 + 2 * MAX(2, style->ythickness);
- *natural_height += 2 + 2 * MAX(2, style->ythickness);
+ if (child) {
+ gtk_widget_get_preferred_height(GTK_WIDGET(child), minimal_height, natural_height);
+ } else {
+ *minimal_height = 0;
+ *natural_height = 0;
+ }
+ *minimal_height += 2 + 2 * MAX(2, style->ythickness);
+ *natural_height += 2 + 2 * MAX(2, style->ythickness);
}
#else
static void sp_button_size_request(GtkWidget *widget, GtkRequisition *requisition)
{
- GtkWidget *child = gtk_bin_get_child (GTK_BIN (widget));
- GtkStyle *style = gtk_widget_get_style (widget);
-
- if (child) {
- gtk_widget_size_request (GTK_WIDGET (child), requisition);
- } else {
- requisition->width = 0;
- requisition->height = 0;
- }
-
- requisition->width += 2 + 2 * MAX (2, style->xthickness);
- requisition->height += 2 + 2 * MAX (2, style->ythickness);
+ GtkWidget *child = gtk_bin_get_child(GTK_BIN(widget));
+ GtkStyle *style = gtk_widget_get_style(widget);
+
+ if (child) {
+ gtk_widget_size_request(GTK_WIDGET(child), requisition);
+ } else {
+ requisition->width = 0;
+ requisition->height = 0;
+ }
+
+ requisition->width += 2 + 2 * MAX(2, style->xthickness);
+ requisition->height += 2 + 2 * MAX(2, style->ythickness);
}
#endif
-static void
-sp_button_clicked (GtkButton *button)
+static void sp_button_clicked(GtkButton *button)
{
- SPButton *sp_button=SP_BUTTON (button);
+ SPButton *sp_button = SP_BUTTON(button);
- if (sp_button->type == SP_BUTTON_TYPE_TOGGLE) {
- (GTK_BUTTON_CLASS(sp_button_parent_class))->clicked (button);
- }
+ if (sp_button->type == SP_BUTTON_TYPE_TOGGLE) {
+ (GTK_BUTTON_CLASS(sp_button_parent_class))->clicked(button);
+ }
}
-static gint
-sp_button_process_event (SPButton *button, GdkEvent *event)
+static gint sp_button_process_event(SPButton *button, GdkEvent *event)
{
- switch (event->type) {
- case GDK_2BUTTON_PRESS:
- if (button->doubleclick_action) {
- sp_action_perform (button->doubleclick_action, NULL);
- }
- return TRUE;
- break;
- default:
- break;
- }
-
- return FALSE;
+ switch (event->type) {
+ case GDK_2BUTTON_PRESS:
+ if (button->doubleclick_action) {
+ sp_action_perform(button->doubleclick_action, NULL);
+ }
+ return TRUE;
+ break;
+ default:
+ break;
+ }
+
+ return FALSE;
}
-static void
-sp_button_perform_action (SPButton *button, gpointer /*data*/)
+static void sp_button_perform_action(SPButton *button, gpointer /*data*/)
{
- if (button->action) {
- sp_action_perform (button->action, NULL);
- }
+ if (button->action) {
+ sp_action_perform(button->action, NULL);
+ }
}
-
-GtkWidget *
-sp_button_new( Inkscape::IconSize size, SPButtonType type, SPAction *action, SPAction *doubleclick_action )
+GtkWidget *sp_button_new(Inkscape::IconSize size, SPButtonType type, SPAction *action, SPAction *doubleclick_action)
{
- SPButton *button = SP_BUTTON(g_object_new(SP_TYPE_BUTTON, NULL));
+ SPButton *button = SP_BUTTON(g_object_new(SP_TYPE_BUTTON, NULL));
- button->type = type;
- button->lsize = CLAMP( size, Inkscape::ICON_SIZE_MENU, Inkscape::ICON_SIZE_DECORATION );
+ button->type = type;
+ button->lsize = CLAMP(size, Inkscape::ICON_SIZE_MENU, Inkscape::ICON_SIZE_DECORATION);
- sp_button_set_action (button, action);
- if (doubleclick_action)
- sp_button_set_doubleclick_action (button, doubleclick_action);
+ sp_button_set_action(button, action);
+ if (doubleclick_action)
+ sp_button_set_doubleclick_action(button, doubleclick_action);
- // The Inkscape style is no-relief buttons
- gtk_button_set_relief (GTK_BUTTON (button), GTK_RELIEF_NONE);
+ // The Inkscape style is no-relief buttons
+ gtk_button_set_relief(GTK_BUTTON(button), GTK_RELIEF_NONE);
- return GTK_WIDGET(button);
+ return GTK_WIDGET(button);
}
-void
-sp_button_toggle_set_down (SPButton *button, gboolean down)
+void sp_button_toggle_set_down(SPButton *button, gboolean down)
{
- g_return_if_fail (button->type == SP_BUTTON_TYPE_TOGGLE);
- g_signal_handlers_block_by_func (G_OBJECT (button), (gpointer)G_CALLBACK (sp_button_perform_action), NULL);
- gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), (unsigned int)down);
- g_signal_handlers_unblock_by_func (G_OBJECT (button), (gpointer)G_CALLBACK (sp_button_perform_action), NULL);
+ g_return_if_fail(button->type == SP_BUTTON_TYPE_TOGGLE);
+ g_signal_handlers_block_by_func(G_OBJECT(button), (gpointer)G_CALLBACK(sp_button_perform_action), NULL);
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), (unsigned int)down);
+ g_signal_handlers_unblock_by_func(G_OBJECT(button), (gpointer)G_CALLBACK(sp_button_perform_action), NULL);
}
-static void
-sp_button_set_doubleclick_action (SPButton *button, SPAction *action)
+static void sp_button_set_doubleclick_action(SPButton *button, SPAction *action)
{
- if (button->doubleclick_action) {
- g_object_unref (button->doubleclick_action);
- }
- button->doubleclick_action = action;
- if (action) {
- g_object_ref(action);
- }
-
+ if (button->doubleclick_action) {
+ g_object_unref(button->doubleclick_action);
+ }
+ button->doubleclick_action = action;
+ if (action) {
+ g_object_ref(action);
+ }
}
-static void
-sp_button_set_action (SPButton *button, SPAction *action)
+static void sp_button_set_action(SPButton *button, SPAction *action)
{
- GtkWidget *child;
-
- if (button->action) {
- button->c_set_active.disconnect();
- button->c_set_sensitive.disconnect();
- child = gtk_bin_get_child (GTK_BIN (button));
- if (child) {
- gtk_container_remove (GTK_CONTAINER (button), child);
- }
- g_object_unref(button->action);
- }
- button->action = action;
- if (action) {
- g_object_ref(action);
- button->c_set_active = action->signal_set_active.connect(
- sigc::bind<0>(
- sigc::ptr_fun(&sp_button_action_set_active),
- SP_BUTTON(button)));
- button->c_set_sensitive = action->signal_set_sensitive.connect(
- sigc::bind<0>(
- sigc::ptr_fun(&gtk_widget_set_sensitive),
- GTK_WIDGET(button)));
- if (action->image) {
- child = sp_icon_new (button->lsize, action->image);
- gtk_widget_show (child);
- gtk_container_add (GTK_CONTAINER (button), child);
- }
- }
-
- sp_button_set_composed_tooltip(GTK_WIDGET(button), action);
+ GtkWidget *child;
+
+ if (button->action) {
+ button->c_set_active.disconnect();
+ button->c_set_sensitive.disconnect();
+ child = gtk_bin_get_child(GTK_BIN(button));
+ if (child) {
+ gtk_container_remove(GTK_CONTAINER(button), child);
+ }
+ g_object_unref(button->action);
+ }
+ button->action = action;
+ if (action) {
+ g_object_ref(action);
+ button->c_set_active = action->signal_set_active.connect(
+ sigc::bind<0>(sigc::ptr_fun(&sp_button_action_set_active), SP_BUTTON(button)));
+ button->c_set_sensitive = action->signal_set_sensitive.connect(
+ sigc::bind<0>(sigc::ptr_fun(&gtk_widget_set_sensitive), GTK_WIDGET(button)));
+ if (action->image) {
+ child = sp_icon_new(button->lsize, action->image);
+ gtk_widget_show(child);
+ gtk_container_add(GTK_CONTAINER(button), child);
+ }
+ }
+
+ sp_button_set_composed_tooltip(GTK_WIDGET(button), action);
}
-static void
-sp_button_action_set_active (SPButton *button, bool active)
+static void sp_button_action_set_active(SPButton *button, bool active)
{
- if (button->type != SP_BUTTON_TYPE_TOGGLE) {
- return;
- }
-
- /* temporarily lobotomized until SPActions are per-view */
- if (0 && !active != !SP_BUTTON_IS_DOWN (button)) {
- sp_button_toggle_set_down (button, active);
- }
+ if (button->type != SP_BUTTON_TYPE_TOGGLE) {
+ return;
+ }
+
+ /* temporarily lobotomized until SPActions are per-view */
+ if (0 && !active != !SP_BUTTON_IS_DOWN(button)) {
+ sp_button_toggle_set_down(button, active);
+ }
}
static void sp_button_set_composed_tooltip(GtkWidget *widget, SPAction *action)
{
if (action) {
- unsigned int shortcut = sp_shortcut_get_primary (action->verb);
+ unsigned int shortcut = sp_shortcut_get_primary(action->verb);
if (shortcut != GDK_KEY_VoidSymbol) {
// there's both action and shortcut
gchar *key = sp_shortcut_get_label(shortcut);
- gchar *tip = g_strdup_printf ("%s (%s)", action->tip, key);
+ gchar *tip = g_strdup_printf("%s (%s)", action->tip, key);
gtk_widget_set_tooltip_text(widget, tip);
g_free(tip);
g_free(key);
@@ -302,18 +275,14 @@ static void sp_button_set_composed_tooltip(GtkWidget *widget, SPAction *action)
}
}
-GtkWidget *
-sp_button_new_from_data( Inkscape::IconSize size,
- SPButtonType type,
- Inkscape::UI::View::View *view,
- const gchar *name,
- const gchar *tip )
+GtkWidget *sp_button_new_from_data(Inkscape::IconSize size, SPButtonType type, Inkscape::UI::View::View *view,
+ const gchar *name, const gchar *tip)
{
- GtkWidget *button;
- SPAction *action=sp_action_new(Inkscape::ActionContext(view), name, name, tip, name, 0);
- button = sp_button_new (size, type, action, NULL);
- g_object_unref(action);
- return button;
+ GtkWidget *button;
+ SPAction *action = sp_action_new(Inkscape::ActionContext(view), name, name, tip, name, 0);
+ button = sp_button_new(size, type, action, NULL);
+ g_object_unref(action);
+ return button;
}
/*
@@ -325,4 +294,4 @@ sp_button_new_from_data( Inkscape::IconSize size,
fill-column:99
End:
*/
-// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8 :
diff --git a/src/widgets/button.h b/src/widgets/button.h
index 41863357d..2bceb5e97 100644
--- a/src/widgets/button.h
+++ b/src/widgets/button.h
@@ -1,7 +1,7 @@
-#ifndef __SP_BUTTON_H__
-#define __SP_BUTTON_H__
+#ifndef SEEN_SP_BUTTON_H
+#define SEEN_SP_BUTTON_H
-/*
+/**
* Generic button widget
*
* Author:
@@ -17,10 +17,18 @@
#define SP_IS_BUTTON(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), SP_TYPE_BUTTON))
#include <gtk/gtk.h>
-#include <sigc++/sigc++.h>
-#include "helper/action.h"
+#include <sigc++/connection.h>
#include "icon-size.h"
+struct SPAction;
+
+namespace Inkscape {
+namespace UI {
+namespace View {
+class View;
+}
+}
+}
typedef enum {
SP_BUTTON_TYPE_NORMAL,
@@ -61,6 +69,15 @@ GtkWidget *sp_button_new_from_data (Inkscape::IconSize size,
const gchar *name,
const gchar *tip);
+#endif // !SEEN_SP_BUTTON_H
-
-#endif
+/*
+ Local Variables:
+ mode:c++
+ c-file-style:"stroustrup"
+ c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
+ indent-tabs-mode:nil
+ fill-column:99
+ End:
+*/
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8 :
diff --git a/src/widgets/calligraphy-toolbar.cpp b/src/widgets/calligraphy-toolbar.cpp
index 9c0393cd9..4ae6427ad 100644
--- a/src/widgets/calligraphy-toolbar.cpp
+++ b/src/widgets/calligraphy-toolbar.cpp
@@ -34,9 +34,9 @@
#include "desktop.h"
#include "document-undo.h"
-#include "ege-adjustment-action.h"
-#include "ege-select-one-action.h"
-#include "ink-action.h"
+#include "widgets/ege-adjustment-action.h"
+#include "widgets/ege-select-one-action.h"
+#include "widgets/ink-action.h"
#include "preferences.h"
#include "toolbox.h"
#include "ui/icon-names.h"
diff --git a/src/widgets/connector-toolbar.cpp b/src/widgets/connector-toolbar.cpp
index 9bbc1bbb4..6ce926dc1 100644
--- a/src/widgets/connector-toolbar.cpp
+++ b/src/widgets/connector-toolbar.cpp
@@ -35,10 +35,10 @@
#include "desktop-handles.h"
#include "desktop.h"
#include "document-undo.h"
-#include "ege-adjustment-action.h"
+#include "widgets/ege-adjustment-action.h"
#include "enums.h"
#include "graphlayout.h"
-#include "ink-action.h"
+#include "widgets/ink-action.h"
#include "inkscape.h"
#include "preferences.h"
#include "selection.h"
diff --git a/src/widgets/dash-selector.cpp b/src/widgets/dash-selector.cpp
index fce7a9d9f..479895022 100644
--- a/src/widgets/dash-selector.cpp
+++ b/src/widgets/dash-selector.cpp
@@ -25,7 +25,7 @@
#include <2geom/coord.h>
#include "style.h"
-#include "dialogs/dialog-events.h"
+#include "ui/dialog-events.h"
#include "preferences.h"
#include "ui/widget/spinbutton.h"
#include "display/cairo-utils.h"
diff --git a/src/widgets/desktop-widget.cpp b/src/widgets/desktop-widget.cpp
index 1b4648286..9c8dac7dc 100644
--- a/src/widgets/desktop-widget.cpp
+++ b/src/widgets/desktop-widget.cpp
@@ -38,7 +38,7 @@
#include "display/canvas-arena.h"
#include "document.h"
#include "ege-color-prof-tracker.h"
-#include "ege-select-one-action.h"
+#include "widgets/ege-select-one-action.h"
#include <extension/db.h>
#include "file.h"
#include "helper/action.h"
@@ -46,7 +46,7 @@
#include "util/units.h"
#include "ui/widget/unit-tracker.h"
#include "inkscape-private.h"
-#include "interface.h"
+#include "ui/interface.h"
#include "macros.h"
#include "preferences.h"
#include "sp-image.h"
@@ -358,7 +358,7 @@ void SPDesktopWidget::init( SPDesktopWidget *dtw )
{
using Inkscape::UI::Dialogs::SwatchesPanel;
- dtw->panels = new SwatchesPanel("/embedded/swatches");
+ dtw->panels = new SwatchesPanel("/embedded/swatches" /*false*/);
dtw->panels->setOrientation(SP_ANCHOR_SOUTH);
#if GTK_CHECK_VERSION(3,0,0)
diff --git a/src/widgets/dropper-toolbar.cpp b/src/widgets/dropper-toolbar.cpp
index 478d0c1a4..45ed9ead4 100644
--- a/src/widgets/dropper-toolbar.cpp
+++ b/src/widgets/dropper-toolbar.cpp
@@ -32,8 +32,8 @@
#include "dropper-toolbar.h"
#include "document-undo.h"
-#include "ege-output-action.h"
-#include "ink-action.h"
+#include "widgets/ege-output-action.h"
+#include "widgets/ink-action.h"
#include "preferences.h"
#include "widgets/spinbutton-events.h"
diff --git a/src/widgets/eek-preview.h b/src/widgets/eek-preview.h
index e4c724cc5..883ce713e 100644
--- a/src/widgets/eek-preview.h
+++ b/src/widgets/eek-preview.h
@@ -37,7 +37,6 @@
#ifndef SEEN_EEK_PREVIEW_H
#define SEEN_EEK_PREVIEW_H
-#include <gdk/gdk.h>
#include <gtk/gtk.h>
/**
diff --git a/src/ege-adjustment-action.cpp b/src/widgets/ege-adjustment-action.cpp
index 9491468dc..d89a6e3f1 100644
--- a/src/ege-adjustment-action.cpp
+++ b/src/widgets/ege-adjustment-action.cpp
@@ -46,7 +46,7 @@
#include <gdk/gdkkeysyms.h>
#include "icon-size.h"
-#include "ege-adjustment-action.h"
+#include "widgets/ege-adjustment-action.h"
#include "ui/widget/gimpspinscale.h"
#include "ui/icon-names.h"
diff --git a/src/ege-adjustment-action.h b/src/widgets/ege-adjustment-action.h
index 590035eb3..8cfaa3e52 100644
--- a/src/ege-adjustment-action.h
+++ b/src/widgets/ege-adjustment-action.h
@@ -45,9 +45,7 @@
/* Note: this file should be kept compilable as both .cpp and .c */
-#include <glib.h>
#include <gtk/gtk.h>
-#include <glib-object.h>
G_BEGIN_DECLS
diff --git a/src/ege-output-action.cpp b/src/widgets/ege-output-action.cpp
index 9a7d7e318..5dece8e91 100644
--- a/src/ege-output-action.cpp
+++ b/src/widgets/ege-output-action.cpp
@@ -43,7 +43,7 @@
#include <gtk/gtk.h>
-#include "ege-output-action.h"
+#include "widgets/ege-output-action.h"
static void ege_output_action_get_property( GObject* obj, guint propId, GValue* value, GParamSpec * pspec );
diff --git a/src/ege-output-action.h b/src/widgets/ege-output-action.h
index fc21c2f27..0f4e21805 100644
--- a/src/ege-output-action.h
+++ b/src/widgets/ege-output-action.h
@@ -45,9 +45,7 @@
/* Note: this file should be kept compilable as both .cpp and .c */
-#include <glib.h>
#include <gtk/gtk.h>
-#include <glib-object.h>
G_BEGIN_DECLS
diff --git a/src/ege-select-one-action.cpp b/src/widgets/ege-select-one-action.cpp
index 3facf7242..ab86c49f8 100644
--- a/src/ege-select-one-action.cpp
+++ b/src/widgets/ege-select-one-action.cpp
@@ -43,7 +43,7 @@
#include <gtk/gtk.h>
-#include "ege-select-one-action.h"
+#include "widgets/ege-select-one-action.h"
enum {
CHANGED = 0,
diff --git a/src/ege-select-one-action.h b/src/widgets/ege-select-one-action.h
index d605f4a67..0c5cecaa3 100644
--- a/src/ege-select-one-action.h
+++ b/src/widgets/ege-select-one-action.h
@@ -48,9 +48,7 @@
/* Note: this file should be kept compilable as both .cpp and .c */
-#include <glib.h>
#include <gtk/gtk.h>
-#include <glib-object.h>
G_BEGIN_DECLS
diff --git a/src/widgets/eraser-toolbar.cpp b/src/widgets/eraser-toolbar.cpp
index 14e7cbf4e..f547cbd8b 100644
--- a/src/widgets/eraser-toolbar.cpp
+++ b/src/widgets/eraser-toolbar.cpp
@@ -35,9 +35,9 @@
#include "desktop-handles.h"
#include "desktop.h"
#include "document-undo.h"
-#include "ege-adjustment-action.h"
-#include "ege-select-one-action.h"
-#include "ink-action.h"
+#include "widgets/ege-adjustment-action.h"
+#include "widgets/ege-select-one-action.h"
+#include "widgets/ink-action.h"
#include "preferences.h"
#include "toolbox.h"
#include "ui/icon-names.h"
diff --git a/src/widgets/font-selector.cpp b/src/widgets/font-selector.cpp
index 327349844..943434868 100644
--- a/src/widgets/font-selector.cpp
+++ b/src/widgets/font-selector.cpp
@@ -1,6 +1,4 @@
-#define __SP_FONT_SELECTOR_C__
-
-/*
+/**
* Font selection widgets
*
* Authors:
@@ -38,7 +36,11 @@
struct SPFontSelector
{
+#if GTK_CHECK_VERSION(3,0,0)
+ GtkBox hbox;
+#else
GtkHBox hbox;
+#endif
unsigned int block_emit : 1;
@@ -59,7 +61,11 @@ struct SPFontSelector
struct SPFontSelectorClass
{
+#if GTK_CHECK_VERSION(3,0,0)
+ GtkBoxClass parent_class;
+#else
GtkHBoxClass parent_class;
+#endif
void (* font_set) (SPFontSelector *fsel, gchar *fontspec);
};
@@ -69,8 +75,6 @@ enum {
LAST_SIGNAL
};
-static void sp_font_selector_class_init (SPFontSelectorClass *c);
-static void sp_font_selector_init (SPFontSelector *fsel);
static void sp_font_selector_dispose (GObject *object);
static void sp_font_selector_family_select_row (GtkTreeSelection *selection,
@@ -85,36 +89,18 @@ static void sp_font_selector_size_changed (GtkComboBox *combobo
static void sp_font_selector_emit_set (SPFontSelector *fsel);
static void sp_font_selector_set_sizes( SPFontSelector *fsel );
-static GtkHBoxClass *fs_parent_class = NULL;
static guint fs_signals[LAST_SIGNAL] = { 0 };
-GType sp_font_selector_get_type()
-{
- static GType type = 0;
- if (!type) {
- GTypeInfo info = {
- sizeof(SPFontSelectorClass),
- 0, // base_init
- 0, // base_finalize
- (GClassInitFunc)sp_font_selector_class_init,
- 0, // class_finalize
- 0, // class_data
- sizeof(SPFontSelector),
- 0, // n_preallocs
- (GInstanceInitFunc)sp_font_selector_init,
- 0 // value_table
- };
- type = g_type_register_static(GTK_TYPE_HBOX, "SPFontSelector", &info, static_cast<GTypeFlags>(0));
- }
- return type;
-}
+#if GTK_CHECK_VERSION(3,0,0)
+G_DEFINE_TYPE(SPFontSelector, sp_font_selector, GTK_TYPE_BOX);
+#else
+G_DEFINE_TYPE(SPFontSelector, sp_font_selector, GTK_TYPE_HBOX);
+#endif
static void sp_font_selector_class_init(SPFontSelectorClass *c)
{
GObjectClass *object_class = G_OBJECT_CLASS(c);
- fs_parent_class = (GtkHBoxClass* )g_type_class_peek_parent (c);
-
fs_signals[FONT_SET] = g_signal_new ("font_set",
G_TYPE_FROM_CLASS(object_class),
(GSignalFlags)G_SIGNAL_RUN_FIRST,
@@ -285,8 +271,8 @@ static void sp_font_selector_dispose(GObject *object)
fsel->styles.length = 0;
}
- if (G_OBJECT_CLASS(fs_parent_class)->dispose) {
- G_OBJECT_CLASS(fs_parent_class)->dispose(object);
+ if (G_OBJECT_CLASS(sp_font_selector_parent_class)->dispose) {
+ G_OBJECT_CLASS(sp_font_selector_parent_class)->dispose(object);
}
}
@@ -554,4 +540,4 @@ double sp_font_selector_get_size(SPFontSelector *fsel)
fill-column:99
End:
*/
-// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4 :
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8 :
diff --git a/src/widgets/font-selector.h b/src/widgets/font-selector.h
index 66715f048..ff5472d2d 100644
--- a/src/widgets/font-selector.h
+++ b/src/widgets/font-selector.h
@@ -54,7 +54,7 @@ Glib::ustring sp_font_selector_get_fontspec (SPFontSelector *fsel);
double sp_font_selector_get_size (SPFontSelector *fsel);
-#endif // SP_FONT_SELECTOR_H
+#endif // !SP_FONT_SELECTOR_H
/*
Local Variables:
@@ -65,4 +65,4 @@ double sp_font_selector_get_size (SPFontSelector *fsel);
fill-column:99
End:
*/
-// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8 :
diff --git a/src/widgets/gradient-image.cpp b/src/widgets/gradient-image.cpp
index 64b058f62..6901b8549 100644
--- a/src/widgets/gradient-image.cpp
+++ b/src/widgets/gradient-image.cpp
@@ -1,6 +1,4 @@
-#define __SP_GRADIENT_IMAGE_C__
-
-/*
+/**
* A simple gradient preview
*
* Author:
@@ -12,18 +10,15 @@
* Released under GNU GPL, read the file 'COPYING' for more information
*/
-#include "macros.h"
+#include <sigc++/sigc++.h>
+
#include "display/cairo-utils.h"
#include "gradient-image.h"
+#include "macros.h"
#include "sp-gradient.h"
-#include <sigc++/functors/ptr_fun.h>
-#include <sigc++/adaptors/bind.h>
-
#define VBLOCK 16
-static void sp_gradient_image_class_init (SPGradientImageClass *klass);
-static void sp_gradient_image_init (SPGradientImage *image);
static void sp_gradient_image_size_request (GtkWidget *widget, GtkRequisition *requisition);
#if GTK_CHECK_VERSION(3,0,0)
@@ -45,35 +40,13 @@ static void sp_gradient_image_gradient_release (SPObject *, SPGradientImage *im)
static void sp_gradient_image_gradient_modified (SPObject *, guint flags, SPGradientImage *im);
static void sp_gradient_image_update (SPGradientImage *img);
-static GtkWidgetClass *parent_class;
-
-GType sp_gradient_image_get_type(void)
-{
- static GType type = 0;
- if (!type) {
- GTypeInfo info = {
- sizeof (SPGradientImageClass),
- NULL, NULL,
- (GClassInitFunc) sp_gradient_image_class_init,
- NULL, NULL,
- sizeof (SPGradientImage),
- 0,
- (GInstanceInitFunc) sp_gradient_image_init,
- NULL
- };
- type = g_type_register_static (GTK_TYPE_WIDGET, "SPGradientImage", &info, (GTypeFlags)0);
- }
- return type;
-}
+G_DEFINE_TYPE(SPGradientImage, sp_gradient_image, GTK_TYPE_WIDGET);
static void sp_gradient_image_class_init(SPGradientImageClass *klass)
{
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS(klass);
- parent_class = GTK_WIDGET_CLASS(g_type_class_peek_parent (klass));
#if GTK_CHECK_VERSION(3,0,0)
-// GObjectClass *object_class = G_OBJECT_CLASS(klass);
-
widget_class->get_preferred_width = sp_gradient_image_get_preferred_width;
widget_class->get_preferred_height = sp_gradient_image_get_preferred_height;
widget_class->draw = sp_gradient_image_draw;
@@ -116,11 +89,11 @@ static void sp_gradient_image_destroy(GtkObject *object)
image->modified_connection.~connection();
#if GTK_CHECK_VERSION(3,0,0)
- if (parent_class->destroy)
- (* (parent_class)->destroy) (object);
+ if (GTK_WIDGET_CLASS(sp_gradient_image_parent_class)->destroy)
+ GTK_WIDGET_CLASS(sp_gradient_image_parent_class)->destroy(object);
#else
- if ((GTK_OBJECT_CLASS(parent_class))->destroy)
- (* (GTK_OBJECT_CLASS(parent_class))->destroy) (object);
+ if (GTK_OBJECT_CLASS(sp_gradient_image_parent_class)->destroy)
+ GTK_OBJECT_CLASS(sp_gradient_image_parent_class)->destroy(object);
#endif
}
@@ -269,3 +242,14 @@ sp_gradient_image_update (SPGradientImage *image)
gtk_widget_queue_draw (GTK_WIDGET (image));
}
}
+
+/*
+ Local Variables:
+ mode:c++
+ c-file-style:"stroustrup"
+ c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
+ indent-tabs-mode:nil
+ fill-column:99
+ End:
+*/
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8 :
diff --git a/src/widgets/gradient-image.h b/src/widgets/gradient-image.h
index 904ce4cac..0d3833441 100644
--- a/src/widgets/gradient-image.h
+++ b/src/widgets/gradient-image.h
@@ -1,7 +1,7 @@
-#ifndef __SP_GRADIENT_IMAGE_H__
-#define __SP_GRADIENT_IMAGE_H__
+#ifndef SEEN_SP_GRADIENT_IMAGE_H
+#define SEEN_SP_GRADIENT_IMAGE_H
-/*
+/**
* A simple gradient preview
*
* Author:
@@ -17,9 +17,6 @@
class SPGradient;
-#include <glib.h>
-
-#include <stddef.h>
#include <sigc++/connection.h>
#define SP_TYPE_GRADIENT_IMAGE (sp_gradient_image_get_type ())
@@ -29,15 +26,15 @@ class SPGradient;
#define SP_IS_GRADIENT_IMAGE_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), SP_TYPE_GRADIENT_IMAGE))
struct SPGradientImage {
- GtkWidget widget;
- SPGradient *gradient;
+ GtkWidget widget;
+ SPGradient *gradient;
- sigc::connection release_connection;
- sigc::connection modified_connection;
+ sigc::connection release_connection;
+ sigc::connection modified_connection;
};
struct SPGradientImageClass {
- GtkWidgetClass parent_class;
+ GtkWidgetClass parent_class;
};
GType sp_gradient_image_get_type (void);
@@ -47,3 +44,14 @@ GdkPixbuf *sp_gradient_to_pixbuf (SPGradient *gr, int width, int height);
void sp_gradient_image_set_gradient (SPGradientImage *gi, SPGradient *gr);
#endif
+
+/*
+ Local Variables:
+ mode:c++
+ c-file-style:"stroustrup"
+ c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
+ indent-tabs-mode:nil
+ fill-column:99
+ End:
+*/
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8 :
diff --git a/src/widgets/gradient-selector.cpp b/src/widgets/gradient-selector.cpp
index 871d1ee4c..a5e16aed2 100644
--- a/src/widgets/gradient-selector.cpp
+++ b/src/widgets/gradient-selector.cpp
@@ -16,13 +16,15 @@
#ifdef HAVE_CONFIG_H
# include "config.h"
#endif
+
+#include <gtkmm/treeview.h>
+
#include "gradient-vector.h"
-#include <gtk/gtk.h>
#include "document.h"
-#include "../document-undo.h"
-#include "../document-private.h"
-#include "../gradient-chemistry.h"
+#include "document-undo.h"
+#include "document-private.h"
+#include "gradient-chemistry.h"
#include "inkscape.h"
#include "verbs.h"
#include "helper/action.h"
@@ -47,8 +49,6 @@ enum {
};
-static void sp_gradient_selector_class_init (SPGradientSelectorClass *klass);
-static void sp_gradient_selector_init (SPGradientSelector *selector);
static void sp_gradient_selector_dispose(GObject *object);
/* Signal handlers */
@@ -57,41 +57,18 @@ static void sp_gradient_selector_edit_vector_clicked (GtkWidget *w, SPGradientSe
static void sp_gradient_selector_add_vector_clicked (GtkWidget *w, SPGradientSelector *sel);
static void sp_gradient_selector_delete_vector_clicked (GtkWidget *w, SPGradientSelector *sel);
-
-static GtkVBoxClass *parent_class;
static guint signals[LAST_SIGNAL] = {0};
-GType sp_gradient_selector_get_type(void)
-{
- static GType type = 0;
- if (!type) {
- static const GTypeInfo info = {
- sizeof(SPGradientSelectorClass),
- NULL, /* base_init */
- NULL, /* base_finalize */
- (GClassInitFunc) sp_gradient_selector_class_init,
- NULL, /* class_finalize */
- NULL, /* class_data */
- sizeof(SPGradientSelector),
- 0, /* n_preallocs */
- (GInstanceInitFunc) sp_gradient_selector_init,
- 0, /* value_table */
- };
-
- type = g_type_register_static( GTK_TYPE_VBOX,
- "SPGradientSelector",
- &info,
- static_cast< GTypeFlags > (0) );
- }
- return type;
-}
+#if GTK_CHECK_VERSION(3,0,0)
+G_DEFINE_TYPE(SPGradientSelector, sp_gradient_selector, GTK_TYPE_BOX);
+#else
+G_DEFINE_TYPE(SPGradientSelector, sp_gradient_selector, GTK_TYPE_VBOX);
+#endif
static void sp_gradient_selector_class_init(SPGradientSelectorClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS(klass);
- parent_class = GTK_VBOX_CLASS(g_type_class_peek_parent (klass));
-
signals[GRABBED] = g_signal_new ("grabbed",
G_TYPE_FROM_CLASS(object_class),
(GSignalFlags)(G_SIGNAL_RUN_FIRST | G_SIGNAL_NO_RECURSE),
@@ -128,6 +105,11 @@ static void sp_gradient_selector_init(SPGradientSelector *sel)
{
sel->safelyInit = true;
sel->blocked = false;
+
+#if GTK_CHECK_VERSION(3,0,0)
+ gtk_orientable_set_orientation(GTK_ORIENTABLE(sel), GTK_ORIENTATION_VERTICAL);
+#endif
+
new (&sel->nonsolid) std::vector<GtkWidget*>();
new (&sel->swatch_widgets) std::vector<GtkWidget*>();
@@ -269,8 +251,8 @@ static void sp_gradient_selector_dispose(GObject *object)
sel->text_renderer = NULL;
}
- if ((G_OBJECT_CLASS(parent_class))->dispose) {
- (* (G_OBJECT_CLASS(parent_class))->dispose) (object);
+ if ((G_OBJECT_CLASS(sp_gradient_selector_parent_class))->dispose) {
+ (G_OBJECT_CLASS(sp_gradient_selector_parent_class))->dispose(object);
}
}
diff --git a/src/widgets/gradient-selector.h b/src/widgets/gradient-selector.h
index 1f58de2e4..e090d7cbd 100644
--- a/src/widgets/gradient-selector.h
+++ b/src/widgets/gradient-selector.h
@@ -19,27 +19,23 @@
# include <config.h>
#endif
-#if GLIBMM_DISABLE_DEPRECATED && HAVE_GLIBMM_THREADS_H
-#include <glibmm/threads.h>
-#endif
-
-#include <glib.h>
-#include <gtk/gtk.h>
-
-#include <gtkmm/entry.h>
-#include <gtkmm/label.h>
-#include <gtkmm/table.h>
#include <gtkmm/liststore.h>
-#include <gtkmm/treeview.h>
#include <gtkmm/scrolledwindow.h>
#include <vector>
-#include "sp-gradient.h"
#include "sp-gradient-spread.h"
#include "sp-gradient-units.h"
+class SPDocument;
class SPGradient;
+namespace Gtk {
+class CellRendererPixbuf;
+class CellRendererText;
+class ScrolledWindow;
+class TreeView;
+}
+
#define SP_TYPE_GRADIENT_SELECTOR (sp_gradient_selector_get_type ())
#define SP_GRADIENT_SELECTOR(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), SP_TYPE_GRADIENT_SELECTOR, SPGradientSelector))
#define SP_GRADIENT_SELECTOR_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), SP_TYPE_GRADIENT_SELECTOR, SPGradientSelectorClass))
@@ -49,11 +45,18 @@ class SPGradient;
struct SPGradientSelector {
+#if GTK_CHECK_VERSION(3,0,0)
+ GtkBox vbox;
+#else
GtkVBox vbox;
+#endif
enum SelectorMode {
MODE_LINEAR,
MODE_RADIAL,
+#ifdef WITH_MESH
+ MODE_MESH,
+#endif
MODE_SWATCH
};
@@ -128,7 +131,11 @@ struct SPGradientSelector {
};
struct SPGradientSelectorClass {
+#if GTK_CHECK_VERSION(3,0,0)
+ GtkBoxClass parent_class;
+#else
GtkVBoxClass parent_class;
+#endif
void (* grabbed) (SPGradientSelector *sel);
void (* dragged) (SPGradientSelector *sel);
diff --git a/src/widgets/gradient-toolbar.cpp b/src/widgets/gradient-toolbar.cpp
index 9cd742fb4..b6378b251 100644
--- a/src/widgets/gradient-toolbar.cpp
+++ b/src/widgets/gradient-toolbar.cpp
@@ -22,12 +22,12 @@
#include "desktop.h"
#include "document-undo.h"
#include "document.h"
-#include "ege-adjustment-action.h"
-#include "ege-select-one-action.h"
+#include "widgets/ege-adjustment-action.h"
+#include "widgets/ege-select-one-action.h"
#include "gradient-chemistry.h"
#include "gradient-drag.h"
#include "gradient-toolbar.h"
-#include "ink-action.h"
+#include "widgets/ink-action.h"
#include "macros.h"
#include "preferences.h"
#include "selection.h"
diff --git a/src/widgets/gradient-vector.cpp b/src/widgets/gradient-vector.cpp
index 17ac887c4..6607c90d2 100644
--- a/src/widgets/gradient-vector.cpp
+++ b/src/widgets/gradient-vector.cpp
@@ -23,6 +23,7 @@
# include "config.h"
#endif
+#include <glibmm.h>
#include "gradient-vector.h"
#include "ui/widget/color-preview.h"
#include "verbs.h"
@@ -30,17 +31,17 @@
#include "macros.h"
#include <glibmm/i18n.h>
#include <set>
-#include "../widgets/gradient-image.h"
-#include "../inkscape.h"
-#include "../document-private.h"
-#include "../gradient-chemistry.h"
-#include "../helper/window.h"
+#include "widgets/gradient-image.h"
+#include "inkscape.h"
+#include "document-private.h"
+#include "gradient-chemistry.h"
+#include "helper/window.h"
#include "io/resource.h"
#include "xml/repr.h"
-#include "../dialogs/dialog-events.h"
-#include "../preferences.h"
+#include "ui/dialog-events.h"
+#include "preferences.h"
#include "svg/css-ostringstream.h"
#include "sp-stop.h"
#include "selection-chemistry.h"
@@ -50,8 +51,7 @@
#include "desktop.h"
#include "layer-manager.h"
-#include <sigc++/functors/ptr_fun.h>
-#include <sigc++/adaptors/bind.h>
+#include <sigc++/sigc++.h>
#include "document-undo.h"
using Inkscape::DocumentUndo;
@@ -61,9 +61,6 @@ enum {
LAST_SIGNAL
};
-static void sp_gradient_vector_selector_class_init(SPGradientVectorSelectorClass *klass);
-static void sp_gradient_vector_selector_init(SPGradientVectorSelector *gvs);
-
#if GTK_CHECK_VERSION(3,0,0)
static void sp_gradient_vector_selector_destroy(GtkWidget *object);
#else
@@ -79,7 +76,6 @@ static SPStop *get_selected_stop( GtkWidget *vb);
void gr_get_usage_counts(SPDocument *doc, std::map<SPGradient *, gint> *mapUsageCount );
unsigned long sp_gradient_to_hhssll(SPGradient *gr);
-static GtkVBoxClass *parent_class;
static guint signals[LAST_SIGNAL] = {0};
// TODO FIXME kill these globals!!!
@@ -88,35 +84,15 @@ static win_data wd;
static gint x = -1000, y = -1000, w = 0, h = 0; // impossible original values to make sure they are read from prefs
static Glib::ustring const prefs_path = "/dialogs/gradienteditor/";
-GType sp_gradient_vector_selector_get_type(void)
-{
- static GType type = 0;
- if (!type) {
- static const GTypeInfo info = {
- sizeof(SPGradientVectorSelectorClass),
- NULL, /* base_init */
- NULL, /* base_finalize */
- reinterpret_cast<GClassInitFunc>(sp_gradient_vector_selector_class_init),
- NULL, /* class_finalize */
- NULL, /* class_data */
- sizeof(SPGradientVectorSelector),
- 0, /* n_preallocs */
- reinterpret_cast<GInstanceInitFunc>(sp_gradient_vector_selector_init),
- 0, /* value_table */
- };
-
- type = g_type_register_static( GTK_TYPE_VBOX,
- "SPGradientVectorSelector",
- &info,
- static_cast< GTypeFlags >(0) );
- }
- return type;
-}
+#if GTK_CHECK_VERSION(3,0,0)
+G_DEFINE_TYPE(SPGradientVectorSelector, sp_gradient_vector_selector, GTK_TYPE_BOX);
+#else
+G_DEFINE_TYPE(SPGradientVectorSelector, sp_gradient_vector_selector, GTK_TYPE_VBOX);
+#endif
static void sp_gradient_vector_selector_class_init(SPGradientVectorSelectorClass *klass)
{
GObjectClass *gobject_class = G_OBJECT_CLASS(klass);
- parent_class = static_cast<GtkVBoxClass*>(g_type_class_peek_parent(klass));
signals[VECTOR_SET] = g_signal_new( "vector_set",
G_TYPE_FROM_CLASS(gobject_class),
@@ -138,6 +114,10 @@ static void sp_gradient_vector_selector_class_init(SPGradientVectorSelectorClass
static void sp_gradient_vector_selector_init(SPGradientVectorSelector *gvs)
{
+#if GTK_CHECK_VERSION(3,0,0)
+ gtk_orientable_set_orientation(GTK_ORIENTABLE(gvs), GTK_ORIENTATION_VERTICAL);
+#endif
+
gvs->idlabel = TRUE;
gvs->swatched = false;
@@ -181,12 +161,12 @@ static void sp_gradient_vector_selector_destroy(GtkObject *object)
gvs->tree_select_connection.~connection();
#if GTK_CHECK_VERSION(3,0,0)
- if ((reinterpret_cast<GtkWidgetClass *>(parent_class))->destroy) {
- (* (reinterpret_cast<GtkWidgetClass *>(parent_class))->destroy) (object);
+ if ((GTK_WIDGET_CLASS(sp_gradient_vector_selector_parent_class))->destroy) {
+ (GTK_WIDGET_CLASS(sp_gradient_vector_selector_parent_class))->destroy(object);
}
#else
- if ((reinterpret_cast<GtkObjectClass *>(parent_class))->destroy) {
- (* (reinterpret_cast<GtkObjectClass *>(parent_class))->destroy) (object);
+ if ((GTK_OBJECT_CLASS(sp_gradient_vector_selector_parent_class))->destroy) {
+ (GTK_OBJECT_CLASS(sp_gradient_vector_selector_parent_class))->destroy(object);
}
#endif
}
@@ -488,10 +468,10 @@ void SPGradientVectorSelector::setSwatched()
### Vector Editing Widget
##################################################################*/
-#include "../widgets/sp-color-notebook.h"
-#include "../widgets/widget-sizes.h"
-#include "../xml/node-event-vector.h"
-#include "../svg/svg-color.h"
+#include "widgets/sp-color-notebook.h"
+#include "widgets/widget-sizes.h"
+#include "xml/node-event-vector.h"
+#include "svg/svg-color.h"
#define PAD 4
diff --git a/src/widgets/gradient-vector.h b/src/widgets/gradient-vector.h
index b63120a6e..5ae90b28f 100644
--- a/src/widgets/gradient-vector.h
+++ b/src/widgets/gradient-vector.h
@@ -19,16 +19,8 @@
# include "config.h"
#endif
-#if GLIBMM_DISABLE_DEPRECATED && HAVE_GLIBMM_THREADS_H
-#include <glibmm/threads.h>
-#endif
-
#include <gtkmm/liststore.h>
-
-#include <stddef.h>
#include <sigc++/connection.h>
-
-#include <gtk/gtk.h>
#include "gradient-selector.h"
#define SP_TYPE_GRADIENT_VECTOR_SELECTOR (sp_gradient_vector_selector_get_type ())
@@ -43,7 +35,11 @@ class SPGradient;
class SPStop;
struct SPGradientVectorSelector {
+#if GTK_CHECK_VERSION(3,0,0)
+ GtkBox vbox;
+#else
GtkVBox vbox;
+#endif
guint idlabel : 1;
@@ -65,7 +61,11 @@ struct SPGradientVectorSelector {
};
struct SPGradientVectorSelectorClass {
+#if GTK_CHECK_VERSION(3,0,0)
+ GtkBoxClass parent_class;
+#else
GtkVBoxClass parent_class;
+#endif
void (* vector_set) (SPGradientVectorSelector *gvs, SPGradient *gr);
};
diff --git a/src/widgets/icon.cpp b/src/widgets/icon.cpp
index eb16cfece..a6e53d638 100644
--- a/src/widgets/icon.cpp
+++ b/src/widgets/icon.cpp
@@ -247,7 +247,11 @@ gboolean IconImpl::draw(GtkWidget *widget, cairo_t* cr)
bool unref_image = false;
/* copied from the expose function of GtkImage */
+#if GTK_CHECK_VERSION(3,0,0)
+ if (gtk_widget_get_state_flags (GTK_WIDGET(icon)) != GTK_STATE_FLAG_NORMAL && image) {
+#else
if (gtk_widget_get_state (GTK_WIDGET(icon)) != GTK_STATE_NORMAL && image) {
+#endif
GtkIconSource *source = gtk_icon_source_new();
gtk_icon_source_set_pixbuf(source, icon->pb);
gtk_icon_source_set_size(source, GTK_ICON_SIZE_SMALL_TOOLBAR); // note: this is boilerplate and not used
@@ -685,6 +689,7 @@ void IconImpl::setupLegacyNaming() {
legacyNames["draw-star"] ="star_angled";
legacyNames["path-mode-bezier"] ="bezier_mode";
legacyNames["path-mode-spiro"] ="spiro_splines_mode";
+ legacyNames["path-mode-bspline"] ="bspline_mode";
legacyNames["path-mode-polyline"] ="polylines_mode";
legacyNames["path-mode-polyline-paraxial"] ="paraxial_lines_mode";
legacyNames["draw-use-tilt"] ="guse_tilt";
diff --git a/src/widgets/icon.h b/src/widgets/icon.h
index e1dae0d6a..5838d8de4 100644
--- a/src/widgets/icon.h
+++ b/src/widgets/icon.h
@@ -14,14 +14,6 @@
* Released under GNU GPL, read the file 'COPYING' for more information
*/
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif
-
-#if GLIBMM_DISABLE_DEPRECATED && HAVE_GLIBMM_THREADS_H
-#include <glibmm/threads.h>
-#endif
-
#include <gtkmm/widget.h>
#include "icon-size.h"
diff --git a/src/ink-action.cpp b/src/widgets/ink-action.cpp
index dd1fe5484..5941c31e4 100644
--- a/src/ink-action.cpp
+++ b/src/widgets/ink-action.cpp
@@ -3,7 +3,7 @@
#include <glib/gi18n.h>
#include <gtk/gtk.h>
-#include "ink-action.h"
+#include "widgets/ink-action.h"
#include "widgets/button.h"
diff --git a/src/ink-action.h b/src/widgets/ink-action.h
index 1d4106681..ac5cb9873 100644
--- a/src/ink-action.h
+++ b/src/widgets/ink-action.h
@@ -2,9 +2,7 @@
#define SEEN_INK_ACTION
-#include <glib.h>
#include <gtk/gtk.h>
-#include <glib-object.h>
#include "icon-size.h"
#include "attributes.h"
diff --git a/src/ink-comboboxentry-action.cpp b/src/widgets/ink-comboboxentry-action.cpp
index f7d1c8724..1114d2cdb 100644
--- a/src/ink-comboboxentry-action.cpp
+++ b/src/widgets/ink-comboboxentry-action.cpp
@@ -30,7 +30,7 @@
#include <gtk/gtk.h>
#include <gdk/gdkkeysyms.h>
-#include "ink-comboboxentry-action.h"
+#include "widgets/ink-comboboxentry-action.h"
#include "ui/icon-names.h"
// Must handle both tool and menu items!
diff --git a/src/ink-comboboxentry-action.h b/src/widgets/ink-comboboxentry-action.h
index a66f0790e..04b66e8fe 100644
--- a/src/ink-comboboxentry-action.h
+++ b/src/widgets/ink-comboboxentry-action.h
@@ -19,12 +19,8 @@
#ifndef SEEN_INK_COMBOBOXENTRY_ACTION
#define SEEN_INK_COMBOBOXENTRY_ACTION
-#include <glib.h>
-#include <glib-object.h>
-
#include <gtk/gtk.h>
-
#define INK_COMBOBOXENTRY_TYPE_ACTION (ink_comboboxentry_action_get_type())
#define INK_COMBOBOXENTRY_ACTION(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), INK_COMBOBOXENTRY_TYPE_ACTION, Ink_ComboBoxEntry_Action))
#define INK_COMBOBOXENTRY_ACTION_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), INK_COMBOBOXENTRY_TYPE_ACTION, Ink_ComboBoxEntry_ActionClass))
diff --git a/src/widgets/lpe-toolbar.cpp b/src/widgets/lpe-toolbar.cpp
index e9e5af912..a85f3ae78 100644
--- a/src/widgets/lpe-toolbar.cpp
+++ b/src/widgets/lpe-toolbar.cpp
@@ -30,19 +30,18 @@
#include "live_effects/lpe-line_segment.h"
#include "lpe-toolbar.h"
-#include "connection-pool.h"
#include "desktop-handles.h"
#include "desktop.h"
#include "document-undo.h"
-#include "ege-select-one-action.h"
+#include "widgets/ege-select-one-action.h"
#include "helper/action-context.h"
#include "helper/action.h"
-#include "ink-action.h"
+#include "widgets/ink-action.h"
#include "live_effects/effect.h"
#include "preferences.h"
#include "selection.h"
#include "sp-namedview.h"
-#include "tools-switch.h"
+#include "ui/tools-switch.h"
#include "ui/tools/lpe-tool.h"
#include "ui/widget/unit-tracker.h"
#include "util/units.h"
@@ -180,6 +179,7 @@ static void lpetool_unit_changed(GtkAction* /*act*/, GObject* tbl)
{
UnitTracker* tracker = reinterpret_cast<UnitTracker*>(g_object_get_data(tbl, "tracker"));
Unit const *unit = tracker->getActiveUnit();
+ g_return_if_fail(unit != NULL);
Inkscape::Preferences *prefs = Inkscape::Preferences::get();
prefs->setString("/tools/lpetool/unit", unit->abbr);
@@ -275,12 +275,15 @@ static void lpetool_open_lpe_dialog(GtkToggleAction *act, gpointer data)
gtk_toggle_action_set_active(act, false);
}
+static void lpetool_toolbox_watch_ec(SPDesktop* dt, Inkscape::UI::Tools::ToolBase* ec, GObject* holder);
+
void sp_lpetool_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainActions, GObject* holder)
{
UnitTracker* tracker = new UnitTracker(Inkscape::Util::UNIT_TYPE_LINEAR);
tracker->setActiveUnit(sp_desktop_namedview(desktop)->doc_units);
g_object_set_data(holder, "tracker", tracker);
Unit const *unit = tracker->getActiveUnit();
+ g_return_if_fail(unit != NULL);
Inkscape::Preferences *prefs = Inkscape::Preferences::get();
prefs->setString("/tools/lpetool/unit", unit->abbr);
@@ -400,21 +403,27 @@ void sp_lpetool_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainActions, GO
gtk_toggle_action_set_active( GTK_TOGGLE_ACTION(act), FALSE );
}
- //watch selection
- Inkscape::ConnectionPool* pool = Inkscape::ConnectionPool::new_connection_pool ("ISNodeToolbox");
+ desktop->connectEventContextChanged(sigc::bind(sigc::ptr_fun(lpetool_toolbox_watch_ec), holder));
+}
- sigc::connection *c_selection_modified =
- new sigc::connection (sp_desktop_selection (desktop)->connectModified
- (sigc::bind (sigc::ptr_fun (sp_lpetool_toolbox_sel_modified), holder)));
- pool->add_connection ("selection-modified", c_selection_modified);
+static void lpetool_toolbox_watch_ec(SPDesktop* desktop, Inkscape::UI::Tools::ToolBase* ec, GObject* holder)
+{
+ static sigc::connection c_selection_modified;
+ static sigc::connection c_selection_changed;
- sigc::connection *c_selection_changed =
- new sigc::connection (sp_desktop_selection (desktop)->connectChanged
- (sigc::bind (sigc::ptr_fun(sp_lpetool_toolbox_sel_changed), holder)));
- pool->add_connection ("selection-changed", c_selection_changed);
+ if (SP_IS_LPETOOL_CONTEXT(ec)) {
+ // Watch selection
+ c_selection_modified = sp_desktop_selection(desktop)->connectModified(sigc::bind(sigc::ptr_fun(sp_lpetool_toolbox_sel_modified), holder));
+ c_selection_changed = sp_desktop_selection(desktop)->connectChanged(sigc::bind(sigc::ptr_fun(sp_lpetool_toolbox_sel_changed), holder));
+ sp_lpetool_toolbox_sel_changed(sp_desktop_selection(desktop), holder);
+ } else {
+ if (c_selection_modified)
+ c_selection_modified.disconnect();
+ if (c_selection_changed)
+ c_selection_changed.disconnect();
+ }
}
-
/*
Local Variables:
mode:c++
@@ -424,4 +433,4 @@ void sp_lpetool_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainActions, GO
fill-column:99
End:
*/
-// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8 :
diff --git a/src/widgets/mappings.xml b/src/widgets/mappings.xml
index 2de3ff545..089bf76ea 100644
--- a/src/widgets/mappings.xml
+++ b/src/widgets/mappings.xml
@@ -197,6 +197,7 @@
<!-- bezier toolbar -->
<remap id='bezier_mode' newid='path-mode-bezier'/>
<remap id='spiro_splines_mode' newid='path-mode-spiro'/>
+ <remap id='bspline_mode' newid='path-mode-bspline'/>
<remap id='polylines_mode' newid='path-mode-polyline'/>
<remap id='paraxial_lines_mode' newid='path-mode-polyline-paraxial'/>
diff --git a/src/widgets/measure-toolbar.cpp b/src/widgets/measure-toolbar.cpp
index 46d3bd4e0..1a4678332 100644
--- a/src/widgets/measure-toolbar.cpp
+++ b/src/widgets/measure-toolbar.cpp
@@ -34,8 +34,8 @@
#include "desktop-handles.h"
#include "desktop.h"
#include "document-undo.h"
-#include "ege-adjustment-action.h"
-#include "ege-output-action.h"
+#include "widgets/ege-adjustment-action.h"
+#include "widgets/ege-output-action.h"
#include "preferences.h"
#include "toolbox.h"
#include "ui/widget/unit-tracker.h"
diff --git a/src/widgets/mesh-toolbar.cpp b/src/widgets/mesh-toolbar.cpp
index 15dda94f0..897d84278 100644
--- a/src/widgets/mesh-toolbar.cpp
+++ b/src/widgets/mesh-toolbar.cpp
@@ -42,6 +42,7 @@
#include <glibmm/i18n.h>
#include "ui/tools/gradient-tool.h"
+#include "ui/tools/mesh-tool.h"
#include "gradient-drag.h"
#include "sp-mesh-gradient.h"
#include "gradient-chemistry.h"
@@ -49,17 +50,16 @@
#include "selection.h"
#include "ui/icon-names.h"
-#include "../ege-adjustment-action.h"
-#include "../ege-output-action.h"
-#include "../ege-select-one-action.h"
-#include "../ink-action.h"
-#include "../ink-comboboxentry-action.h"
+#include "widgets/ege-adjustment-action.h"
+#include "widgets/ege-output-action.h"
+#include "widgets/ege-select-one-action.h"
+#include "widgets/ink-action.h"
+#include "widgets/ink-comboboxentry-action.h"
#include "sp-stop.h"
#include "svg/css-ostringstream.h"
#include "svg/svg-color.h"
#include "desktop-style.h"
-#include "ui/tools/gradient-tool.h"
#include "toolbox.h"
@@ -67,7 +67,7 @@ using Inkscape::DocumentUndo;
using Inkscape::UI::ToolboxFactory;
using Inkscape::UI::PrefPusher;
-static gboolean blocked = FALSE;
+static bool blocked = false;
//########################
//## Mesh ##
@@ -116,22 +116,16 @@ static void ms_drag_selection_changed(gpointer /*dragger*/, gpointer data)
}
-static void ms_defs_release(SPObject * /*defs*/, GtkWidget *widget)
+static void ms_defs_release(SPObject * /*defs*/, GObject *widget)
{
ms_tb_selection_changed(NULL, widget);
}
-static void ms_defs_modified(SPObject * /*defs*/, guint /*flags*/, GtkWidget *widget)
+static void ms_defs_modified(SPObject * /*defs*/, guint /*flags*/, GObject *widget)
{
- ms_tb_selection_changed(NULL, (gpointer) widget);
-}
-
-static void ms_disconnect_sigc(GObject * /*obj*/, sigc::connection *connection) {
- connection->disconnect();
- delete connection;
+ ms_tb_selection_changed(NULL, widget);
}
-
/*
* Callback functions for user actions
*/
@@ -184,6 +178,8 @@ static void ms_col_changed(GtkAdjustment *adj, GObject * /*tbl*/ )
blocked = FALSE;
}
+static void mesh_toolbox_watch_ec(SPDesktop* dt, Inkscape::UI::Tools::ToolBase* ec, GObject* holder);
+
/**
* Mesh auxiliary toolbar construction and setup.
*
@@ -323,35 +319,43 @@ void sp_mesh_toolbox_prep(SPDesktop * desktop, GtkActionGroup* mainActions, GObj
g_signal_connect( holder, "destroy", G_CALLBACK(delete_prefspusher), pusher);
}
-
- Inkscape::Selection *selection = sp_desktop_selection (desktop);
- SPDocument *document = sp_desktop_document (desktop);
-
g_object_set_data(holder, "desktop", desktop);
- // connect to selection modified and changed signals
- sigc::connection *conn1 = new sigc::connection(
- selection->connectChanged(sigc::bind(sigc::ptr_fun(&ms_tb_selection_changed), (gpointer) holder)));
- sigc::connection *conn2 = new sigc::connection(
- selection->connectModified(sigc::bind(sigc::ptr_fun(&ms_tb_selection_modified), (gpointer) holder)));
- sigc::connection *conn3 = new sigc::connection(
- desktop->connectToolSubselectionChanged( sigc::bind(sigc::ptr_fun(&ms_drag_selection_changed), (gpointer) holder)));
-
- // when holder is destroyed, disconnect
- g_signal_connect(G_OBJECT(holder), "destroy", G_CALLBACK(ms_disconnect_sigc), conn1);
- g_signal_connect(G_OBJECT(holder), "destroy", G_CALLBACK(ms_disconnect_sigc), conn2);
- g_signal_connect(G_OBJECT(holder), "destroy", G_CALLBACK(ms_disconnect_sigc), conn3);
-
- // connect to release and modified signals of the defs (i.e. when someone changes mesh)
- sigc::connection *release_connection = new sigc::connection();
- *release_connection = document->getDefs()->connectRelease(sigc::bind<1>(sigc::ptr_fun(&ms_defs_release), GTK_WIDGET(holder)));
- sigc::connection *modified_connection = new sigc::connection();
- *modified_connection = document->getDefs()->connectModified(sigc::bind<2>(sigc::ptr_fun(&ms_defs_modified), GTK_WIDGET(holder)));
-
- // when holder is destroyed, disconnect
- g_signal_connect(G_OBJECT(holder), "destroy", G_CALLBACK(ms_disconnect_sigc), release_connection);
- g_signal_connect(G_OBJECT(holder), "destroy", G_CALLBACK(ms_disconnect_sigc), modified_connection);
+ desktop->connectEventContextChanged(sigc::bind(sigc::ptr_fun(mesh_toolbox_watch_ec), holder));
+}
+static void mesh_toolbox_watch_ec(SPDesktop* desktop, Inkscape::UI::Tools::ToolBase* ec, GObject* holder)
+{
+ static sigc::connection c_selection_changed;
+ static sigc::connection c_selection_modified;
+ static sigc::connection c_subselection_changed;
+ static sigc::connection c_defs_release;
+ static sigc::connection c_defs_modified;
+
+ if (SP_IS_MESH_CONTEXT(ec)) {
+ // connect to selection modified and changed signals
+ Inkscape::Selection *selection = sp_desktop_selection (desktop);
+ SPDocument *document = sp_desktop_document (desktop);
+
+ c_selection_changed = selection->connectChanged(sigc::bind(sigc::ptr_fun(&ms_tb_selection_changed), holder));
+ c_selection_modified = selection->connectModified(sigc::bind(sigc::ptr_fun(&ms_tb_selection_modified), holder));
+ c_subselection_changed = desktop->connectToolSubselectionChanged(sigc::bind(sigc::ptr_fun(&ms_drag_selection_changed), holder));
+
+ c_defs_release = document->getDefs()->connectRelease(sigc::bind<1>(sigc::ptr_fun(&ms_defs_release), holder));
+ c_defs_modified = document->getDefs()->connectModified(sigc::bind<2>(sigc::ptr_fun(&ms_defs_modified), holder));
+ ms_tb_selection_changed(selection, holder);
+ } else {
+ if (c_selection_changed)
+ c_selection_changed.disconnect();
+ if (c_selection_modified)
+ c_selection_modified.disconnect();
+ if (c_subselection_changed)
+ c_subselection_changed.disconnect();
+ if (c_defs_release)
+ c_defs_release.disconnect();
+ if (c_defs_modified)
+ c_defs_modified.disconnect();
+ }
}
/*
diff --git a/src/widgets/node-toolbar.cpp b/src/widgets/node-toolbar.cpp
index 39e0a9be0..467325d08 100644
--- a/src/widgets/node-toolbar.cpp
+++ b/src/widgets/node-toolbar.cpp
@@ -31,12 +31,11 @@
#include "ui/tool/multi-path-manipulator.h"
#include <glibmm/i18n.h>
#include "node-toolbar.h"
-#include "connection-pool.h"
#include "desktop-handles.h"
#include "desktop.h"
#include "document-undo.h"
-#include "ege-adjustment-action.h"
-#include "ink-action.h"
+#include "widgets/ege-adjustment-action.h"
+#include "widgets/ink-action.h"
#include "inkscape.h"
#include "preferences.h"
#include "selection-chemistry.h"
@@ -229,6 +228,7 @@ static void sp_node_toolbox_coord_changed(gpointer /*shape_editor*/, GObject *tb
return;
}
Unit const *unit = tracker->getActiveUnit();
+ g_return_if_fail(unit != NULL);
NodeTool *nt = get_node_tool();
if (!nt || !(nt->_selected_nodes) ||nt->_selected_nodes->empty()) {
@@ -321,7 +321,7 @@ static void sp_node_toolbox_sel_modified(Inkscape::Selection *selection, guint /
sp_node_toolbox_sel_changed (selection, tbl);
}
-
+static void node_toolbox_watch_ec(SPDesktop* dt, Inkscape::UI::Tools::ToolBase* ec, GObject* holder);
//################################
//## Node Editing Toolbox ##
@@ -614,32 +614,33 @@ void sp_node_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainActions, GObje
gtk_action_group_add_action( mainActions, act );
}
-
sp_node_toolbox_sel_changed(sp_desktop_selection(desktop), holder);
+ desktop->connectEventContextChanged(sigc::bind(sigc::ptr_fun(node_toolbox_watch_ec), holder));
- //watch selection
- Inkscape::ConnectionPool* pool = Inkscape::ConnectionPool::new_connection_pool ("ISNodeToolbox");
-
- sigc::connection *c_selection_changed =
- new sigc::connection (sp_desktop_selection (desktop)->connectChanged
- (sigc::bind (sigc::ptr_fun (sp_node_toolbox_sel_changed), holder)));
- pool->add_connection ("selection-changed", c_selection_changed);
-
- sigc::connection *c_selection_modified =
- new sigc::connection (sp_desktop_selection (desktop)->connectModified
- (sigc::bind (sigc::ptr_fun (sp_node_toolbox_sel_modified), holder)));
- pool->add_connection ("selection-modified", c_selection_modified);
-
- sigc::connection *c_subselection_changed =
- new sigc::connection (desktop->connectToolSubselectionChanged
- (sigc::bind (sigc::ptr_fun (sp_node_toolbox_coord_changed), holder)));
- pool->add_connection ("tool-subselection-changed", c_subselection_changed);
+} // end of sp_node_toolbox_prep()
- Inkscape::ConnectionPool::connect_destroy (G_OBJECT (holder), pool);
+static void node_toolbox_watch_ec(SPDesktop* desktop, Inkscape::UI::Tools::ToolBase* ec, GObject* holder)
+{
+ static sigc::connection c_selection_changed;
+ static sigc::connection c_selection_modified;
+ static sigc::connection c_subselection_changed;
- g_signal_connect( holder, "destroy", G_CALLBACK(purge_repr_listener), holder );
-} // end of sp_node_toolbox_prep()
+ if (INK_IS_NODE_TOOL(ec)) {
+ // watch selection
+ c_selection_changed = sp_desktop_selection(desktop)->connectChanged(sigc::bind(sigc::ptr_fun(sp_node_toolbox_sel_changed), holder));
+ c_selection_modified = sp_desktop_selection(desktop)->connectModified(sigc::bind(sigc::ptr_fun(sp_node_toolbox_sel_modified), holder));
+ c_subselection_changed = desktop->connectToolSubselectionChanged(sigc::bind(sigc::ptr_fun(sp_node_toolbox_coord_changed), holder));
+ sp_node_toolbox_sel_changed(sp_desktop_selection(desktop), holder);
+ } else {
+ if (c_selection_changed)
+ c_selection_changed.disconnect();
+ if (c_selection_modified)
+ c_selection_modified.disconnect();
+ if (c_subselection_changed)
+ c_subselection_changed.disconnect();
+ }
+}
/*
diff --git a/src/widgets/paint-selector.cpp b/src/widgets/paint-selector.cpp
index 9466c875e..6ef910f61 100644
--- a/src/widgets/paint-selector.cpp
+++ b/src/widgets/paint-selector.cpp
@@ -29,14 +29,15 @@
#endif
#include "widgets/swatch-selector.h"
-#include "../sp-pattern.h"
+#include "sp-pattern.h"
#include <glibmm/i18n.h>
-#include "../widgets/icon.h"
+#include "widgets/icon.h"
#include "widgets/widget-sizes.h"
#include "xml/repr.h"
#include "sp-color-notebook.h"
#include "sp-linear-gradient.h"
+#include "sp-mesh-gradient.h"
#include "sp-radial-gradient.h"
/* fixme: Move it from dialogs to here */
#include "gradient-selector.h"
@@ -71,8 +72,6 @@ enum {
LAST_SIGNAL
};
-static void sp_paint_selector_class_init(SPPaintSelectorClass *klass);
-static void sp_paint_selector_init(SPPaintSelector *slider);
static void sp_paint_selector_dispose(GObject *object);
static GtkWidget *sp_paint_selector_style_button_add(SPPaintSelector *psel, gchar const *px, SPPaintSelector::Mode mode, gchar const *tip);
@@ -91,7 +90,6 @@ static void sp_paint_selector_set_mode_unset(SPPaintSelector *psel);
static void sp_paint_selector_set_style_buttons(SPPaintSelector *psel, GtkWidget *active);
-static GtkVBoxClass *parent_class;
static guint psel_signals[LAST_SIGNAL] = {0};
#ifdef SP_PS_VERBOSE
@@ -113,10 +111,13 @@ static gchar const* modeStrings[] = {
#endif
-static bool isPaintModeGradient( SPPaintSelector::Mode mode )
+static bool isPaintModeGradient(SPPaintSelector::Mode mode)
{
bool isGrad = (mode == SPPaintSelector::MODE_GRADIENT_LINEAR) ||
(mode == SPPaintSelector::MODE_GRADIENT_RADIAL) ||
+#ifdef WITH_MESH
+ (mode == SPPaintSelector::MODE_GRADIENT_MESH) ||
+#endif
(mode == SPPaintSelector::MODE_SWATCH);
return isGrad;
@@ -136,34 +137,17 @@ static SPGradientSelector *getGradientFromData(SPPaintSelector const *psel)
return grad;
}
-GType sp_paint_selector_get_type(void)
-{
- static GType type = 0;
- if (!type) {
- GTypeInfo info = {
- sizeof(SPPaintSelectorClass),
- 0, // base_init
- 0, // base_finalize
- (GClassInitFunc)sp_paint_selector_class_init,
- 0, // class_finalize
- 0, // class_data
- sizeof(SPPaintSelector),
- 0, // n_preallocs
- (GInstanceInitFunc)sp_paint_selector_init,
- 0 // value_table
- };
- type = g_type_register_static(GTK_TYPE_VBOX, "SPPaintSelector", &info, static_cast<GTypeFlags>(0));
- }
- return type;
-}
+#if GTK_CHECK_VERSION(3,0,0)
+G_DEFINE_TYPE(SPPaintSelector, sp_paint_selector, GTK_TYPE_BOX);
+#else
+G_DEFINE_TYPE(SPPaintSelector, sp_paint_selector, GTK_TYPE_VBOX);
+#endif
static void
sp_paint_selector_class_init(SPPaintSelectorClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS(klass);
- parent_class = GTK_VBOX_CLASS(g_type_class_peek_parent(klass));
-
psel_signals[MODE_CHANGED] = g_signal_new("mode_changed",
G_TYPE_FROM_CLASS(object_class),
(GSignalFlags)(G_SIGNAL_RUN_FIRST | G_SIGNAL_NO_RECURSE),
@@ -216,6 +200,10 @@ sp_paint_selector_class_init(SPPaintSelectorClass *klass)
static void
sp_paint_selector_init(SPPaintSelector *psel)
{
+#if GTK_CHECK_VERSION(3,0,0)
+ gtk_orientable_set_orientation(GTK_ORIENTABLE(psel), GTK_ORIENTATION_VERTICAL);
+#endif
+
psel->mode = static_cast<SPPaintSelector::Mode>(-1); // huh? do you mean 0xff? -- I think this means "not in the enum"
/* Paint style button box */
@@ -238,6 +226,10 @@ sp_paint_selector_init(SPPaintSelector *psel)
SPPaintSelector::MODE_GRADIENT_LINEAR, _("Linear gradient"));
psel->radial = sp_paint_selector_style_button_add(psel, INKSCAPE_ICON("paint-gradient-radial"),
SPPaintSelector::MODE_GRADIENT_RADIAL, _("Radial gradient"));
+#ifdef WITH_MESH
+ psel->mesh = sp_paint_selector_style_button_add(psel, INKSCAPE_ICON("paint-gradient-mesh"),
+ SPPaintSelector::MODE_GRADIENT_MESH, _("Mesh gradient"));
+#endif
psel->pattern = sp_paint_selector_style_button_add(psel, INKSCAPE_ICON("paint-pattern"),
SPPaintSelector::MODE_PATTERN, _("Pattern"));
psel->swatch = sp_paint_selector_style_button_add(psel, INKSCAPE_ICON("paint-swatch"),
@@ -314,8 +306,8 @@ static void sp_paint_selector_dispose(GObject *object)
// clean up our long-living pattern menu
g_object_set_data(G_OBJECT(psel),"patternmenu",NULL);
- if ((G_OBJECT_CLASS(parent_class))->dispose)
- (* (G_OBJECT_CLASS(parent_class))->dispose)(object);
+ if ((G_OBJECT_CLASS(sp_paint_selector_parent_class))->dispose)
+ (G_OBJECT_CLASS(sp_paint_selector_parent_class))->dispose(object);
}
static GtkWidget *sp_paint_selector_style_button_add(SPPaintSelector *psel,
@@ -413,6 +405,9 @@ void SPPaintSelector::setMode(Mode mode)
break;
case MODE_GRADIENT_LINEAR:
case MODE_GRADIENT_RADIAL:
+#ifdef WITH_MESH
+ case MODE_GRADIENT_MESH:
+#endif
sp_paint_selector_set_mode_gradient(this, mode);
break;
case MODE_PATTERN:
@@ -511,6 +506,21 @@ void SPPaintSelector::setGradientRadial(SPGradient *vector)
gsel->setVector((vector) ? vector->document : 0, vector);
}
+#ifdef WITH_MESH
+void SPPaintSelector::setGradientMesh(SPGradient *vector)
+{
+#ifdef SP_PS_VERBOSE
+ g_print("PaintSelector set GRADIENT MESH\n");
+#endif
+ setMode(MODE_GRADIENT_RADIAL);
+
+ SPGradientSelector *gsel = getGradientFromData(this);
+
+ gsel->setMode(SPGradientSelector::MODE_MESH);
+ gsel->setVector((vector) ? vector->document : 0, vector);
+}
+#endif
+
void SPPaintSelector::setGradientProperties( SPGradientUnits units, SPGradientSpread spread )
{
g_return_if_fail(isPaintModeGradient(mode));
@@ -665,8 +675,8 @@ static void sp_paint_selector_set_mode_color(SPPaintSelector *psel, SPPaintSelec
/* Create new color selector */
/* Create vbox */
#if GTK_CHECK_VERSION(3,0,0)
- GtkWidget *vb = gtk_box_new(GTK_ORIENTATION_VERTICAL, 4);
- gtk_box_set_homogeneous(GTK_BOX(vb), FALSE);
+ GtkWidget *vb = gtk_box_new(GTK_ORIENTATION_VERTICAL, 4);
+ gtk_box_set_homogeneous(GTK_BOX(vb), FALSE);
#else
GtkWidget *vb = gtk_vbox_new(FALSE, 4);
#endif
@@ -728,9 +738,14 @@ static void sp_paint_selector_set_mode_gradient(SPPaintSelector *psel, SPPaintSe
if (mode == SPPaintSelector::MODE_GRADIENT_LINEAR) {
sp_paint_selector_set_style_buttons(psel, psel->gradient);
- } else {
+ } else if (mode == SPPaintSelector::MODE_GRADIENT_RADIAL) {
sp_paint_selector_set_style_buttons(psel, psel->radial);
}
+#ifdef WITH_MESH
+ else {
+ sp_paint_selector_set_style_buttons(psel, psel->mesh);
+ }
+#endif
gtk_widget_set_sensitive(psel->style, TRUE);
if ((psel->mode == SPPaintSelector::MODE_GRADIENT_LINEAR) || (psel->mode == SPPaintSelector::MODE_GRADIENT_RADIAL)) {
@@ -756,10 +771,17 @@ static void sp_paint_selector_set_mode_gradient(SPPaintSelector *psel, SPPaintSe
SP_GRADIENT_SELECTOR(gsel)->setMode(SPGradientSelector::MODE_LINEAR);
//sp_gradient_selector_set_mode(SP_GRADIENT_SELECTOR(gsel), SP_GRADIENT_SELECTOR_MODE_LINEAR);
gtk_label_set_markup(GTK_LABEL(psel->label), _("<b>Linear gradient</b>"));
- } else {
+ } else if (mode == SPPaintSelector::MODE_GRADIENT_LINEAR) {
SP_GRADIENT_SELECTOR(gsel)->setMode(SPGradientSelector::MODE_RADIAL);
gtk_label_set_markup(GTK_LABEL(psel->label), _("<b>Radial gradient</b>"));
}
+#ifdef WITH_MESH
+ else {
+ SP_GRADIENT_SELECTOR(gsel)->setMode(SPGradientSelector::MODE_RADIAL);
+ gtk_label_set_markup(GTK_LABEL(psel->label), _("<b>Mesh gradient</b>"));
+ }
+#endif
+
#ifdef SP_PS_VERBOSE
g_print("Gradient req\n");
#endif
@@ -772,6 +794,9 @@ sp_paint_selector_set_style_buttons(SPPaintSelector *psel, GtkWidget *active)
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(psel->solid), (active == psel->solid));
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(psel->gradient), (active == psel->gradient));
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(psel->radial), (active == psel->radial));
+#ifdef WITH_MESH
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(psel->mesh), (active == psel->mesh));
+#endif
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(psel->pattern), (active == psel->pattern));
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(psel->swatch), (active == psel->swatch));
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(psel->unset), (active == psel->unset));
@@ -1004,8 +1029,8 @@ static void sp_paint_selector_set_mode_pattern(SPPaintSelector *psel, SPPaintSel
/* Create vbox */
#if GTK_CHECK_VERSION(3,0,0)
- tbl = gtk_box_new(GTK_ORIENTATION_VERTICAL, 4);
- gtk_box_set_homogeneous(GTK_BOX(tbl), FALSE);
+ tbl = gtk_box_new(GTK_ORIENTATION_VERTICAL, 4);
+ gtk_box_set_homogeneous(GTK_BOX(tbl), FALSE);
#else
tbl = gtk_vbox_new(FALSE, 4);
#endif
@@ -1218,6 +1243,10 @@ SPPaintSelector::Mode SPPaintSelector::getModeForStyle(SPStyle const & style, Fi
mode = MODE_GRADIENT_LINEAR;
} else if (SP_IS_RADIALGRADIENT(server)) {
mode = MODE_GRADIENT_RADIAL;
+#ifdef WITH_MESH
+ } else if (SP_IS_MESHGRADIENT(server)) {
+ mode = MODE_GRADIENT_MESH;
+#endif
} else if (SP_IS_PATTERN(server)) {
mode = MODE_PATTERN;
} else {
diff --git a/src/widgets/paint-selector.h b/src/widgets/paint-selector.h
index d6ad3f50c..788aa673e 100644
--- a/src/widgets/paint-selector.h
+++ b/src/widgets/paint-selector.h
@@ -12,7 +12,6 @@
*
*/
-#include <glib.h>
#include <gtk/gtk.h>
#include "color.h"
@@ -35,7 +34,11 @@ class SPStyle;
* Generic paint selector widget.
*/
struct SPPaintSelector {
+#if GTK_CHECK_VERSION(3,0,0)
+ GtkBox vbox;
+#else
GtkVBox vbox;
+#endif
enum Mode {
MODE_EMPTY,
@@ -45,6 +48,9 @@ struct SPPaintSelector {
MODE_COLOR_CMYK,
MODE_GRADIENT_LINEAR,
MODE_GRADIENT_RADIAL,
+#ifdef WITH_MESH
+ MODE_GRADIENT_MESH,
+#endif
MODE_PATTERN,
MODE_SWATCH,
MODE_UNSET
@@ -64,6 +70,9 @@ struct SPPaintSelector {
GtkWidget *solid;
GtkWidget *gradient;
GtkWidget *radial;
+#ifdef WITH_MESH
+ GtkWidget *mesh;
+#endif
GtkWidget *pattern;
GtkWidget *swatch;
GtkWidget *unset;
@@ -88,6 +97,9 @@ struct SPPaintSelector {
void setGradientLinear( SPGradient *vector );
void setGradientRadial( SPGradient *vector );
+#ifdef WITH_MESH
+ void setGradientMesh(SPGradient *vector);
+#endif
void setSwatch( SPGradient *vector );
void setGradientProperties( SPGradientUnits units, SPGradientSpread spread );
@@ -109,7 +121,11 @@ enum {COMBO_COL_LABEL=0, COMBO_COL_STOCK=1, COMBO_COL_PATTERN=2, COMBO_COL_SEP=3
/// The SPPaintSelector vtable
struct SPPaintSelectorClass {
+#if GTK_CHECK_VERSION(3,0,0)
+ GtkBoxClass parent_class;
+#else
GtkVBoxClass parent_class;
+#endif
void (* mode_changed) (SPPaintSelector *psel, SPPaintSelector::Mode mode);
diff --git a/src/widgets/paintbucket-toolbar.cpp b/src/widgets/paintbucket-toolbar.cpp
index e20811de8..d8edeb9f6 100644
--- a/src/widgets/paintbucket-toolbar.cpp
+++ b/src/widgets/paintbucket-toolbar.cpp
@@ -33,8 +33,8 @@
#include "paintbucket-toolbar.h"
#include "desktop.h"
#include "document-undo.h"
-#include "ege-adjustment-action.h"
-#include "ege-select-one-action.h"
+#include "widgets/ege-adjustment-action.h"
+#include "widgets/ege-select-one-action.h"
#include "preferences.h"
#include "toolbox.h"
#include "ui/icon-names.h"
@@ -83,6 +83,8 @@ static void paintbucket_offset_changed(GtkAdjustment *adj, GObject *tbl)
// Don't adjust the offset value because we're saving the
// unit and it'll be correctly handled on load.
prefs->setDouble("/tools/paintbucket/offset", (gdouble)gtk_adjustment_get_value(adj));
+
+ g_return_if_fail(unit != NULL);
prefs->setString("/tools/paintbucket/offsetunits", unit->abbr);
}
diff --git a/src/widgets/pencil-toolbar.cpp b/src/widgets/pencil-toolbar.cpp
index 45a552889..1214a378a 100644
--- a/src/widgets/pencil-toolbar.cpp
+++ b/src/widgets/pencil-toolbar.cpp
@@ -33,12 +33,12 @@
#include "pencil-toolbar.h"
#include "desktop.h"
#include "document-undo.h"
-#include "ege-adjustment-action.h"
-#include "ege-select-one-action.h"
-#include "ink-action.h"
+#include "widgets/ege-adjustment-action.h"
+#include "widgets/ege-select-one-action.h"
+#include "widgets/ink-action.h"
#include "preferences.h"
#include "toolbox.h"
-#include "tools-switch.h"
+#include "ui/tools-switch.h"
#include "ui/icon-names.h"
#include "ui/tools/pen-tool.h"
#include "ui/uxmanager.h"
@@ -104,7 +104,12 @@ static void sp_add_freehand_mode_toggle(GtkActionGroup* mainActions, GObject* ho
1, _("Create Spiro path"),
2, INKSCAPE_ICON("path-mode-spiro"),
-1 );
-
+ gtk_list_store_append( model, &iter );
+ gtk_list_store_set( model, &iter,
+ 0, _("BSpline"),
+ 1, _("Create BSpline path"),
+ 2, INKSCAPE_ICON("path-mode-bspline"),
+ -1 );
if (!tool_is_pencil) {
gtk_list_store_append( model, &iter );
gtk_list_store_set( model, &iter,
@@ -157,6 +162,7 @@ static GList * freehand_shape_dropdown_items_list() {
glist = g_list_append (glist, _("Triangle out"));
glist = g_list_append (glist, _("Ellipse"));
glist = g_list_append (glist, _("From clipboard"));
+ glist = g_list_append (glist, _("Last applied"));
return glist;
}
diff --git a/src/widgets/rect-toolbar.cpp b/src/widgets/rect-toolbar.cpp
index 908e6cc78..e1ce01eaf 100644
--- a/src/widgets/rect-toolbar.cpp
+++ b/src/widgets/rect-toolbar.cpp
@@ -34,9 +34,9 @@
#include "desktop-handles.h"
#include "desktop.h"
#include "document-undo.h"
-#include "ege-adjustment-action.h"
-#include "ege-output-action.h"
-#include "ink-action.h"
+#include "widgets/ege-adjustment-action.h"
+#include "widgets/ege-output-action.h"
+#include "widgets/ink-action.h"
#include "inkscape.h"
#include "preferences.h"
#include "selection.h"
@@ -44,6 +44,7 @@
#include "sp-rect.h"
#include "toolbox.h"
#include "ui/icon-names.h"
+#include "ui/tools/rect-tool.h"
#include "ui/uxmanager.h"
#include "ui/widget/unit-tracker.h"
#include "util/units.h"
@@ -87,6 +88,7 @@ static void sp_rtb_value_changed(GtkAdjustment *adj, GObject *tbl, gchar const *
UnitTracker* tracker = reinterpret_cast<UnitTracker*>(g_object_get_data( tbl, "tracker" ));
Unit const *unit = tracker->getActiveUnit();
+ g_return_if_fail(unit != NULL);
if (DocumentUndo::getUndoSensitive(sp_desktop_document(desktop))) {
Inkscape::Preferences *prefs = Inkscape::Preferences::get();
@@ -180,6 +182,7 @@ static void rect_tb_event_attr_changed(Inkscape::XML::Node * /*repr*/, gchar con
UnitTracker* tracker = reinterpret_cast<UnitTracker*>( g_object_get_data( tbl, "tracker" ) );
Unit const *unit = tracker->getActiveUnit();
Unit const *doc_unit = sp_desktop_namedview(SP_ACTIVE_DESKTOP)->doc_units;
+ g_return_if_fail(unit != NULL);
gpointer item = g_object_get_data( tbl, "item" );
if (item && SP_IS_RECT(item)) {
@@ -286,6 +289,7 @@ static void sp_rect_toolbox_selection_changed(Inkscape::Selection *selection, GO
}
}
+static void rect_toolbox_watch_ec(SPDesktop* dt, Inkscape::UI::Tools::ToolBase* ec, GObject* holder);
void sp_rect_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainActions, GObject* holder)
{
@@ -392,13 +396,21 @@ void sp_rect_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainActions, GObje
g_object_set_data( holder, "single", GINT_TO_POINTER(TRUE) );
sp_rtb_sensitivize( holder );
- sigc::connection *connection = new sigc::connection(
- sp_desktop_selection(desktop)->connectChanged(sigc::bind(sigc::ptr_fun(sp_rect_toolbox_selection_changed), holder))
- );
- g_signal_connect( holder, "destroy", G_CALLBACK(delete_connection), connection );
+ desktop->connectEventContextChanged(sigc::bind(sigc::ptr_fun(rect_toolbox_watch_ec), holder));
g_signal_connect( holder, "destroy", G_CALLBACK(purge_repr_listener), holder );
}
+static void rect_toolbox_watch_ec(SPDesktop* desktop, Inkscape::UI::Tools::ToolBase* ec, GObject* holder)
+{
+ static sigc::connection changed;
+
+ if (SP_IS_RECT_CONTEXT(ec)) {
+ changed = sp_desktop_selection(desktop)->connectChanged(sigc::bind(sigc::ptr_fun(sp_rect_toolbox_selection_changed), holder));
+ } else {
+ if (changed)
+ changed.disconnect();
+ }
+}
/*
Local Variables:
@@ -409,4 +421,4 @@ void sp_rect_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainActions, GObje
fill-column:99
End:
*/
-// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8 :
diff --git a/src/widgets/select-toolbar.cpp b/src/widgets/select-toolbar.cpp
index 284e436bf..08a46354e 100644
--- a/src/widgets/select-toolbar.cpp
+++ b/src/widgets/select-toolbar.cpp
@@ -26,10 +26,10 @@
#include "display/sp-canvas.h"
#include "document-undo.h"
#include "document.h"
-#include "ege-adjustment-action.h"
+#include "widgets/ege-adjustment-action.h"
#include "helper/action-context.h"
#include "helper/action.h"
-#include "ink-action.h"
+#include "widgets/ink-action.h"
#include "inkscape.h"
#include "message-stack.h"
#include "preferences.h"
@@ -73,6 +73,7 @@ sp_selection_layout_widget_update(SPWidget *spw, Inkscape::Selection *sel)
if ( bbox ) {
UnitTracker *tracker = reinterpret_cast<UnitTracker*>(g_object_get_data(G_OBJECT(spw), "tracker"));
Unit const *unit = tracker->getActiveUnit();
+ g_return_if_fail(unit != NULL);
struct { char const *key; double val; } const keyval[] = {
{ "X", bbox->min()[X] },
@@ -178,6 +179,7 @@ sp_object_layout_any_value_changed(GtkAdjustment *adj, SPWidget *spw)
gdouble xrel = 0;
gdouble yrel = 0;
Unit const *unit = tracker->getActiveUnit();
+ g_return_if_fail(unit != NULL);
GtkAdjustment* a_x = GTK_ADJUSTMENT( g_object_get_data( G_OBJECT(spw), "X" ) );
GtkAdjustment* a_y = GTK_ADJUSTMENT( g_object_get_data( G_OBJECT(spw), "Y" ) );
diff --git a/src/widgets/sp-color-icc-selector.cpp b/src/widgets/sp-color-icc-selector.cpp
index 53e73dd57..6e910c582 100644
--- a/src/widgets/sp-color-icc-selector.cpp
+++ b/src/widgets/sp-color-icc-selector.cpp
@@ -10,7 +10,7 @@
#include <set>
#include <vector>
-#include "../dialogs/dialog-events.h"
+#include "ui/dialog-events.h"
#include "sp-color-icc-selector.h"
#include "sp-color-scales.h"
#include "sp-color-slider.h"
@@ -67,10 +67,7 @@ extern guint update_in_progress;
G_BEGIN_DECLS
-static void sp_color_icc_selector_class_init (SPColorICCSelectorClass *klass);
-static void sp_color_icc_selector_init (SPColorICCSelector *cs);
static void sp_color_icc_selector_dispose(GObject *object);
-
static void sp_color_icc_selector_show_all (GtkWidget *widget);
static void sp_color_icc_selector_hide(GtkWidget *widget);
@@ -161,9 +158,6 @@ public:
#endif // defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2)
};
-
-static SPColorSelectorClass *parent_class;
-
#define XPAD 4
#define YPAD 1
@@ -205,8 +199,14 @@ void attachToGridOrTable(GtkWidget *parent,
guint ypadding = YPAD)
{
#if GTK_CHECK_VERSION(3,0,0)
+ #if GTK_CHECK_VERSION(3,12,0)
+ gtk_widget_set_margin_start( child, xpadding );
+ gtk_widget_set_margin_end( child, xpadding );
+ #else
gtk_widget_set_margin_left( child, xpadding );
gtk_widget_set_margin_right( child, xpadding );
+ #endif
+
gtk_widget_set_margin_top( child, ypadding );
gtk_widget_set_margin_bottom( child, ypadding );
if (hexpand) {
@@ -227,30 +227,7 @@ void attachToGridOrTable(GtkWidget *parent,
} // namespace
-GType sp_color_icc_selector_get_type(void)
-{
- static GType type = 0;
- if (!type) {
- static const GTypeInfo info = {
- sizeof (SPColorICCSelectorClass),
- NULL, // base_init
- NULL, // base_finalize
- (GClassInitFunc) sp_color_icc_selector_class_init,
- NULL, // class_finalize
- NULL, // class_data
- sizeof (SPColorICCSelector),
- 0, // n_preallocs
- (GInstanceInitFunc) sp_color_icc_selector_init,
- 0, // value_table
- };
-
- type = g_type_register_static (SP_TYPE_COLOR_SELECTOR,
- "SPColorICCSelector",
- &info,
- static_cast< GTypeFlags > (0) );
- }
- return type;
-}
+G_DEFINE_TYPE(SPColorICCSelector, sp_color_icc_selector, SP_TYPE_COLOR_SELECTOR);
static void sp_color_icc_selector_class_init(SPColorICCSelectorClass *klass)
{
@@ -259,8 +236,6 @@ static void sp_color_icc_selector_class_init(SPColorICCSelectorClass *klass)
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS(klass);
SPColorSelectorClass *selector_class = SP_COLOR_SELECTOR_CLASS (klass);
- parent_class = SP_COLOR_SELECTOR_CLASS (g_type_class_peek_parent (klass));
-
selector_class->name = nameset;
selector_class->submode_count = 1;
@@ -599,8 +574,8 @@ void ColorICCSelector::init()
static void sp_color_icc_selector_dispose(GObject *object)
{
- if ((G_OBJECT_CLASS(parent_class))->dispose) {
- (* (G_OBJECT_CLASS(parent_class))->dispose)(object);
+ if (G_OBJECT_CLASS(sp_color_icc_selector_parent_class)->dispose) {
+ G_OBJECT_CLASS(sp_color_icc_selector_parent_class)->dispose(object);
}
}
diff --git a/src/widgets/sp-color-icc-selector.h b/src/widgets/sp-color-icc-selector.h
index f63ab0853..6cdaff639 100644
--- a/src/widgets/sp-color-icc-selector.h
+++ b/src/widgets/sp-color-icc-selector.h
@@ -2,8 +2,6 @@
#define SEEN_SP_COLOR_ICC_SELECTOR_H
#include <glib.h>
-#include <gtk/gtk.h>
-
#include "sp-color-selector.h"
namespace Inkscape {
diff --git a/src/widgets/sp-color-notebook.cpp b/src/widgets/sp-color-notebook.cpp
index e081f98e0..c7fa96efd 100644
--- a/src/widgets/sp-color-notebook.cpp
+++ b/src/widgets/sp-color-notebook.cpp
@@ -25,7 +25,7 @@
#include <gtk/gtk.h>
#include <glibmm/i18n.h>
-#include "../dialogs/dialog-events.h"
+#include "ui/dialog-events.h"
#include "../preferences.h"
#include "sp-color-notebook.h"
#include "spw-utilities.h"
@@ -38,7 +38,7 @@
#include "../profile-manager.h"
#include "color-profile.h"
#include "cms-system.h"
-#include "tools-switch.h"
+#include "ui/tools-switch.h"
#include "ui/tools/tool-base.h"
using Inkscape::CMSSystem;
@@ -53,46 +53,21 @@ struct SPColorNotebookTracker {
SPColorNotebook *backPointer;
};
-static void sp_color_notebook_class_init (SPColorNotebookClass *klass);
-static void sp_color_notebook_init (SPColorNotebook *colorbook);
static void sp_color_notebook_dispose(GObject *object);
static void sp_color_notebook_show_all (GtkWidget *widget);
static void sp_color_notebook_hide(GtkWidget *widget);
-static SPColorSelectorClass *parent_class;
-
#define XPAD 4
#define YPAD 1
-GType sp_color_notebook_get_type(void)
-{
- static GType type = 0;
- if (!type) {
- GTypeInfo info = {
- sizeof(SPColorNotebookClass),
- 0, // base_init
- 0, // base_finalize
- (GClassInitFunc)sp_color_notebook_class_init,
- 0, // class_finalize
- 0, // class_data
- sizeof(SPColorNotebook),
- 0, // n_preallocs
- (GInstanceInitFunc)sp_color_notebook_init,
- 0 // value_table
- };
- type = g_type_register_static(SP_TYPE_COLOR_SELECTOR, "SPColorNotebook", &info, static_cast<GTypeFlags>(0));
- }
- return type;
-}
+G_DEFINE_TYPE(SPColorNotebook, sp_color_notebook, SP_TYPE_COLOR_SELECTOR);
static void sp_color_notebook_class_init(SPColorNotebookClass *klass)
{
GObjectClass *object_class = reinterpret_cast<GObjectClass *>(klass);
GtkWidgetClass *widget_class = reinterpret_cast<GtkWidgetClass *>(klass);
- parent_class = SP_COLOR_SELECTOR_CLASS(g_type_class_peek_parent(klass));
-
object_class->dispose = sp_color_notebook_dispose;
widget_class->show_all = sp_color_notebook_show_all;
@@ -289,8 +264,13 @@ void ColorNotebook::init()
sp_set_font_size_smaller (_buttonbox);
#if GTK_CHECK_VERSION(3,0,0)
+ #if GTK_CHECK_VERSION(3,12,0)
+ gtk_widget_set_margin_start(_buttonbox, XPAD);
+ gtk_widget_set_margin_end(_buttonbox, XPAD);
+ #else
gtk_widget_set_margin_left(_buttonbox, XPAD);
gtk_widget_set_margin_right(_buttonbox, XPAD);
+ #endif
gtk_widget_set_margin_top(_buttonbox, YPAD);
gtk_widget_set_margin_bottom(_buttonbox, YPAD);
gtk_widget_set_hexpand(_buttonbox, TRUE);
@@ -306,8 +286,13 @@ void ColorNotebook::init()
row++;
#if GTK_CHECK_VERSION(3,0,0)
+ #if GTK_CHECK_VERSION(3,12,0)
+ gtk_widget_set_margin_start(_book, XPAD*2);
+ gtk_widget_set_margin_end(_book, XPAD*2);
+ #else
gtk_widget_set_margin_left(_book, XPAD*2);
gtk_widget_set_margin_right(_book, XPAD*2);
+ #endif
gtk_widget_set_margin_top(_book, YPAD);
gtk_widget_set_margin_bottom(_book, YPAD);
gtk_widget_set_hexpand(_book, TRUE);
@@ -434,8 +419,13 @@ void ColorNotebook::init()
#endif //defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2)
#if GTK_CHECK_VERSION(3,0,0)
+ #if GTK_CHECK_VERSION(3,12,0)
+ gtk_widget_set_margin_start(rgbabox, XPAD);
+ gtk_widget_set_margin_end(rgbabox, XPAD);
+ #else
gtk_widget_set_margin_left(rgbabox, XPAD);
gtk_widget_set_margin_right(rgbabox, XPAD);
+ #endif
gtk_widget_set_margin_top(rgbabox, YPAD);
gtk_widget_set_margin_bottom(rgbabox, YPAD);
gtk_grid_attach(GTK_GRID(table), rgbabox, 0, row, 2, 1);
@@ -457,8 +447,8 @@ void ColorNotebook::init()
static void sp_color_notebook_dispose(GObject *object)
{
- if (((GObjectClass *) (parent_class))->dispose)
- (* ((GObjectClass *) (parent_class))->dispose) (object);
+ if (G_OBJECT_CLASS(sp_color_notebook_parent_class)->dispose)
+ G_OBJECT_CLASS(sp_color_notebook_parent_class)->dispose(object);
}
ColorNotebook::~ColorNotebook()
diff --git a/src/widgets/sp-color-notebook.h b/src/widgets/sp-color-notebook.h
index 6e5111132..469bb56e8 100644
--- a/src/widgets/sp-color-notebook.h
+++ b/src/widgets/sp-color-notebook.h
@@ -12,14 +12,10 @@
* This code is in public domain
*/
-#include <gtk/gtk.h>
-#include "../color.h"
#include "sp-color-selector.h"
#include <glib.h>
-
-
struct SPColorNotebook;
class ColorNotebook: public ColorSelector
diff --git a/src/widgets/sp-color-scales.cpp b/src/widgets/sp-color-scales.cpp
index c3f9d511c..60ba62ec5 100644
--- a/src/widgets/sp-color-scales.cpp
+++ b/src/widgets/sp-color-scales.cpp
@@ -8,8 +8,9 @@
#include <math.h>
#include <gtk/gtk.h>
#include <glibmm/i18n.h>
-#include "../dialogs/dialog-events.h"
+#include "ui/dialog-events.h"
#include "sp-color-scales.h"
+#include "sp-color-slider.h"
#include "svg/svg-icc-color.h"
#define CSC_CHANNEL_R (1 << 0)
@@ -30,8 +31,6 @@
G_BEGIN_DECLS
-static void sp_color_scales_class_init (SPColorScalesClass *klass);
-static void sp_color_scales_init (SPColorScales *cs);
static void sp_color_scales_dispose(GObject *object);
static void sp_color_scales_show_all (GtkWidget *widget);
@@ -41,38 +40,12 @@ static const gchar *sp_color_scales_hue_map (void);
G_END_DECLS
-static SPColorSelectorClass *parent_class;
-
#define XPAD 4
#define YPAD 1
#define noDUMP_CHANGE_INFO 1
-GType
-sp_color_scales_get_type (void)
-{
- static GType type = 0;
- if (!type) {
- static const GTypeInfo info = {
- sizeof (SPColorScalesClass),
- NULL, /* base_init */
- NULL, /* base_finalize */
- (GClassInitFunc) sp_color_scales_class_init,
- NULL, /* class_finalize */
- NULL, /* class_data */
- sizeof (SPColorScales),
- 0, /* n_preallocs */
- (GInstanceInitFunc) sp_color_scales_init,
- NULL
- };
-
- type = g_type_register_static (SP_TYPE_COLOR_SELECTOR,
- "SPColorScales",
- &info,
- static_cast< GTypeFlags > (0) );
- }
- return type;
-}
+G_DEFINE_TYPE(SPColorScales, sp_color_scales, SP_TYPE_COLOR_SELECTOR);
static void
sp_color_scales_class_init (SPColorScalesClass *klass)
@@ -82,8 +55,6 @@ sp_color_scales_class_init (SPColorScalesClass *klass)
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS(klass);
SPColorSelectorClass *selector_class = SP_COLOR_SELECTOR_CLASS (klass);
- parent_class = SP_COLOR_SELECTOR_CLASS (g_type_class_peek_parent (klass));
-
selector_class->name = nameset;
selector_class->submode_count = 3;
@@ -151,8 +122,13 @@ void ColorScales::init()
gtk_widget_show (_l[i]);
#if GTK_CHECK_VERSION(3,0,0)
+ #if GTK_CHECK_VERSION(3,12,0)
+ gtk_widget_set_margin_start(_l[i], XPAD);
+ gtk_widget_set_margin_end(_l[i], XPAD);
+ #else
gtk_widget_set_margin_left(_l[i], XPAD);
gtk_widget_set_margin_right(_l[i], XPAD);
+ #endif
gtk_widget_set_margin_top(_l[i], YPAD);
gtk_widget_set_margin_bottom(_l[i], YPAD);
gtk_grid_attach(GTK_GRID(t), _l[i], 0, i, 1, 1);
@@ -167,8 +143,13 @@ void ColorScales::init()
gtk_widget_show (_s[i]);
#if GTK_CHECK_VERSION(3,0,0)
+ #if GTK_CHECK_VERSION(3,12,0)
+ gtk_widget_set_margin_start(_s[i], XPAD);
+ gtk_widget_set_margin_end(_s[i], XPAD);
+ #else
gtk_widget_set_margin_left(_s[i], XPAD);
gtk_widget_set_margin_right(_s[i], XPAD);
+ #endif
gtk_widget_set_margin_top(_s[i], YPAD);
gtk_widget_set_margin_bottom(_s[i], YPAD);
gtk_widget_set_hexpand(_s[i], TRUE);
@@ -184,8 +165,13 @@ void ColorScales::init()
gtk_widget_show (_b[i]);
#if GTK_CHECK_VERSION(3,0,0)
+ #if GTK_CHECK_VERSION(3,12,0)
+ gtk_widget_set_margin_start(_b[i], XPAD);
+ gtk_widget_set_margin_end(_b[i], XPAD);
+ #else
gtk_widget_set_margin_left(_b[i], XPAD);
gtk_widget_set_margin_right(_b[i], XPAD);
+ #endif
gtk_widget_set_margin_top(_b[i], YPAD);
gtk_widget_set_margin_bottom(_b[i], YPAD);
gtk_widget_set_halign(_b[i], GTK_ALIGN_CENTER);
@@ -214,8 +200,8 @@ void ColorScales::init()
static void sp_color_scales_dispose(GObject *object)
{
- if ((G_OBJECT_CLASS(parent_class))->dispose)
- (* (G_OBJECT_CLASS(parent_class))->dispose) (object);
+ if (G_OBJECT_CLASS(sp_color_scales_parent_class)->dispose)
+ G_OBJECT_CLASS(sp_color_scales_parent_class)->dispose(object);
}
static void
diff --git a/src/widgets/sp-color-scales.h b/src/widgets/sp-color-scales.h
index 3b11bc05e..72cbafa2f 100644
--- a/src/widgets/sp-color-scales.h
+++ b/src/widgets/sp-color-scales.h
@@ -2,15 +2,12 @@
#define SEEN_SP_COLOR_SCALES_H
#include <glib.h>
-#include <gtk/gtk.h>
-#include <color.h>
-#include <widgets/sp-color-slider.h>
#include <widgets/sp-color-selector.h>
-
struct SPColorScales;
struct SPColorScalesClass;
+struct SPColorSlider;
typedef enum {
SP_COLOR_SCALES_MODE_NONE = 0,
diff --git a/src/widgets/sp-color-selector.cpp b/src/widgets/sp-color-selector.cpp
index 6d62acecd..e97c36431 100644
--- a/src/widgets/sp-color-selector.cpp
+++ b/src/widgets/sp-color-selector.cpp
@@ -22,42 +22,20 @@ enum {
#define noDUMP_CHANGE_INFO
#define FOO_NAME(x) g_type_name( G_TYPE_FROM_INSTANCE(x) )
-static void sp_color_selector_class_init( SPColorSelectorClass *klass );
-static void sp_color_selector_init( SPColorSelector *csel );
static void sp_color_selector_dispose(GObject *object);
static void sp_color_selector_show_all( GtkWidget *widget );
static void sp_color_selector_hide( GtkWidget *widget );
-static GtkVBoxClass *parent_class;
static guint csel_signals[LAST_SIGNAL] = {0};
double ColorSelector::_epsilon = 1e-4;
-GType sp_color_selector_get_type( void )
-{
- static GType type = 0;
- if (!type) {
- static const GTypeInfo info = {
- sizeof(SPColorSelectorClass),
- NULL, /* base_init */
- NULL, /* base_finalize */
- (GClassInitFunc) sp_color_selector_class_init,
- NULL, /* class_finalize */
- NULL, /* class_data */
- sizeof(SPColorSelector),
- 0, /* n_preallocs */
- (GInstanceInitFunc) sp_color_selector_init,
- NULL
- };
-
- type = g_type_register_static( GTK_TYPE_VBOX,
- "SPColorSelector",
- &info,
- static_cast<GTypeFlags>(0) );
- }
- return type;
-}
+#if GTK_CHECK_VERSION(3,0,0)
+G_DEFINE_TYPE(SPColorSelector, sp_color_selector, GTK_TYPE_BOX);
+#else
+G_DEFINE_TYPE(SPColorSelector, sp_color_selector, GTK_TYPE_VBOX);
+#endif
void sp_color_selector_class_init( SPColorSelectorClass *klass )
{
@@ -66,8 +44,6 @@ void sp_color_selector_class_init( SPColorSelectorClass *klass )
GtkWidgetClass *widget_class;
widget_class = GTK_WIDGET_CLASS(klass);
- parent_class = GTK_VBOX_CLASS( g_type_class_peek_parent(klass) );
-
csel_signals[GRABBED] = g_signal_new( "grabbed",
G_TYPE_FROM_CLASS(object_class),
(GSignalFlags)(G_SIGNAL_RUN_FIRST | G_SIGNAL_NO_RECURSE),
@@ -109,6 +85,10 @@ void sp_color_selector_class_init( SPColorSelectorClass *klass )
void sp_color_selector_init( SPColorSelector *csel )
{
+#if GTK_CHECK_VERSION(3,0,0)
+ gtk_orientable_set_orientation(GTK_ORIENTABLE(csel), GTK_ORIENTATION_VERTICAL);
+#endif
+
if ( csel->base )
{
csel->base->init();
@@ -125,8 +105,8 @@ void sp_color_selector_dispose(GObject *object)
csel->base = 0;
}
- if ( (G_OBJECT_CLASS(parent_class))->dispose ) {
- (* (G_OBJECT_CLASS(parent_class))->dispose)(object);
+ if ((G_OBJECT_CLASS(sp_color_selector_parent_class))->dispose ) {
+ (G_OBJECT_CLASS(sp_color_selector_parent_class))->dispose(object);
}
}
diff --git a/src/widgets/sp-color-selector.h b/src/widgets/sp-color-selector.h
index 616d5a9e7..30061774a 100644
--- a/src/widgets/sp-color-selector.h
+++ b/src/widgets/sp-color-selector.h
@@ -2,9 +2,7 @@
#define SEEN_SP_COLOR_SELECTOR_H
#include <gtk/gtk.h>
-#include "../color.h"
-
-#include <glib.h>
+#include "color.h"
struct SPColorSelector;
@@ -62,13 +60,21 @@ private:
#define SP_COLOR_SELECTOR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), SP_TYPE_COLOR_SELECTOR, SPColorSelectorClass))
struct SPColorSelector {
+#if GTK_CHECK_VERSION(3,0,0)
+ GtkBox vbox;
+#else
GtkVBox vbox;
+#endif
ColorSelector* base;
};
struct SPColorSelectorClass {
+#if GTK_CHECK_VERSION(3,0,0)
+ GtkBoxClass parent_class;
+#else
GtkVBoxClass parent_class;
+#endif
const gchar **name;
guint submode_count;
diff --git a/src/widgets/sp-color-slider.cpp b/src/widgets/sp-color-slider.cpp
index 9b13ba1c5..ab7e2cd84 100644
--- a/src/widgets/sp-color-slider.cpp
+++ b/src/widgets/sp-color-slider.cpp
@@ -12,6 +12,7 @@
#include <gtk/gtk.h>
#include "sp-color-scales.h"
+#include "sp-color-slider.h"
#include "preferences.h"
#define SLIDER_WIDTH 96
@@ -26,8 +27,6 @@ enum {
LAST_SIGNAL
};
-static void sp_color_slider_class_init (SPColorSliderClass *klass);
-static void sp_color_slider_init (SPColorSlider *slider);
static void sp_color_slider_dispose(GObject *object);
static void sp_color_slider_realize (GtkWidget *widget);
@@ -61,36 +60,15 @@ static const guchar *sp_color_slider_render_gradient (gint x0, gint y0, gint wid
static const guchar *sp_color_slider_render_map (gint x0, gint y0, gint width, gint height,
guchar *map, gint start, gint step, guint b0, guint b1, guint mask);
-static GtkWidgetClass *parent_class;
static guint slider_signals[LAST_SIGNAL] = {0};
-GType
-sp_color_slider_get_type (void)
-{
- static GType type = 0;
- if (!type) {
- GTypeInfo info = {
- sizeof (SPColorSliderClass),
- NULL, NULL,
- (GClassInitFunc) sp_color_slider_class_init,
- NULL, NULL,
- sizeof (SPColorSlider),
- 0,
- (GInstanceInitFunc) sp_color_slider_init,
- NULL
- };
- type = g_type_register_static (GTK_TYPE_WIDGET, "SPColorSlider", &info, (GTypeFlags)0);
- }
- return type;
-}
+G_DEFINE_TYPE(SPColorSlider, sp_color_slider, GTK_TYPE_WIDGET);
static void sp_color_slider_class_init(SPColorSliderClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS(klass);
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS(klass);
- parent_class = GTK_WIDGET_CLASS(g_type_class_peek_parent(klass));
-
slider_signals[GRABBED] = g_signal_new ("grabbed",
G_TYPE_FROM_CLASS(object_class),
(GSignalFlags)(G_SIGNAL_RUN_FIRST | G_SIGNAL_NO_RECURSE),
@@ -183,8 +161,8 @@ static void sp_color_slider_dispose(GObject *object)
slider->adjustment = NULL;
}
- if ((G_OBJECT_CLASS(parent_class))->dispose)
- (* (G_OBJECT_CLASS(parent_class))->dispose) (object);
+ if (G_OBJECT_CLASS(sp_color_slider_parent_class)->dispose)
+ G_OBJECT_CLASS(sp_color_slider_parent_class)->dispose (object);
}
static void
diff --git a/src/widgets/sp-color-slider.h b/src/widgets/sp-color-slider.h
index 591d8368a..b81d62e41 100644
--- a/src/widgets/sp-color-slider.h
+++ b/src/widgets/sp-color-slider.h
@@ -14,13 +14,6 @@
#include <gtk/gtk.h>
-#include <glib.h>
-
-
-
-struct SPColorSlider;
-struct SPColorSliderClass;
-
#define SP_TYPE_COLOR_SLIDER (sp_color_slider_get_type ())
#define SP_COLOR_SLIDER(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), SP_TYPE_COLOR_SLIDER, SPColorSlider))
#define SP_COLOR_SLIDER_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), SP_TYPE_COLOR_SLIDER, SPColorSliderClass))
diff --git a/src/widgets/sp-color-wheel-selector.cpp b/src/widgets/sp-color-wheel-selector.cpp
index 7c8bb1df7..6cfa7c14d 100644
--- a/src/widgets/sp-color-wheel-selector.cpp
+++ b/src/widgets/sp-color-wheel-selector.cpp
@@ -4,17 +4,16 @@
#include <math.h>
#include <gtk/gtk.h>
#include <glibmm/i18n.h>
-#include "../dialogs/dialog-events.h"
+#include "ui/dialog-events.h"
#include "sp-color-wheel-selector.h"
#include "sp-color-scales.h"
+#include "sp-color-slider.h"
#include "sp-color-icc-selector.h"
#include "../svg/svg-icc-color.h"
#include "ui/widget/gimpcolorwheel.h"
G_BEGIN_DECLS
-static void sp_color_wheel_selector_class_init (SPColorWheelSelectorClass *klass);
-static void sp_color_wheel_selector_init (SPColorWheelSelector *cs);
static void sp_color_wheel_selector_dispose(GObject *object);
static void sp_color_wheel_selector_show_all (GtkWidget *widget);
@@ -23,36 +22,10 @@ static void sp_color_wheel_selector_hide(GtkWidget *widget);
G_END_DECLS
-static SPColorSelectorClass *parent_class;
-
#define XPAD 4
#define YPAD 1
-GType
-sp_color_wheel_selector_get_type (void)
-{
- static GType type = 0;
- if (!type) {
- static const GTypeInfo info = {
- sizeof (SPColorWheelSelectorClass),
- NULL, /* base_init */
- NULL, /* base_finalize */
- (GClassInitFunc) sp_color_wheel_selector_class_init,
- NULL, /* class_finalize */
- NULL, /* class_data */
- sizeof (SPColorWheelSelector),
- 0, /* n_preallocs */
- (GInstanceInitFunc) sp_color_wheel_selector_init,
- 0, /* value_table */
- };
-
- type = g_type_register_static (SP_TYPE_COLOR_SELECTOR,
- "SPColorWheelSelector",
- &info,
- static_cast< GTypeFlags > (0) );
- }
- return type;
-}
+G_DEFINE_TYPE(SPColorWheelSelector, sp_color_wheel_selector, SP_TYPE_COLOR_SELECTOR);
static void sp_color_wheel_selector_class_init(SPColorWheelSelectorClass *klass)
{
@@ -61,8 +34,6 @@ static void sp_color_wheel_selector_class_init(SPColorWheelSelectorClass *klass)
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS(klass);
SPColorSelectorClass *selector_class = SP_COLOR_SELECTOR_CLASS (klass);
- parent_class = SP_COLOR_SELECTOR_CLASS (g_type_class_peek_parent (klass));
-
selector_class->name = nameset;
selector_class->submode_count = 1;
@@ -142,8 +113,13 @@ void ColorWheelSelector::init()
gtk_widget_show (_label);
#if GTK_CHECK_VERSION(3,0,0)
+ #if GTK_CHECK_VERSION(3,12,0)
+ gtk_widget_set_margin_start(_label, XPAD);
+ gtk_widget_set_margin_end(_label, XPAD);
+ #else
gtk_widget_set_margin_left(_label, XPAD);
gtk_widget_set_margin_right(_label, XPAD);
+ #endif
gtk_widget_set_margin_top(_label, YPAD);
gtk_widget_set_margin_bottom(_label, YPAD);
gtk_widget_set_halign(_label, GTK_ALIGN_FILL);
@@ -162,8 +138,13 @@ void ColorWheelSelector::init()
gtk_widget_show (_slider);
#if GTK_CHECK_VERSION(3,0,0)
+ #if GTK_CHECK_VERSION(3,12,0)
+ gtk_widget_set_margin_start(_slider, XPAD);
+ gtk_widget_set_margin_end(_slider, XPAD);
+ #else
gtk_widget_set_margin_left(_slider, XPAD);
gtk_widget_set_margin_right(_slider, XPAD);
+ #endif
gtk_widget_set_margin_top(_slider, YPAD);
gtk_widget_set_margin_bottom(_slider, YPAD);
gtk_widget_set_hexpand(_slider, TRUE);
@@ -188,8 +169,13 @@ void ColorWheelSelector::init()
gtk_widget_show (_sbtn);
#if GTK_CHECK_VERSION(3,0,0)
+ #if GTK_CHECK_VERSION(3,12,0)
+ gtk_widget_set_margin_start(_sbtn, XPAD);
+ gtk_widget_set_margin_end(_sbtn, XPAD);
+ #else
gtk_widget_set_margin_left(_sbtn, XPAD);
gtk_widget_set_margin_right(_sbtn, XPAD);
+ #endif
gtk_widget_set_margin_top(_sbtn, YPAD);
gtk_widget_set_margin_bottom(_sbtn, YPAD);
gtk_widget_set_halign(_sbtn, GTK_ALIGN_CENTER);
@@ -216,8 +202,8 @@ void ColorWheelSelector::init()
static void sp_color_wheel_selector_dispose(GObject *object)
{
- if ((G_OBJECT_CLASS(parent_class))->dispose)
- (* (G_OBJECT_CLASS(parent_class))->dispose) (object);
+ if (G_OBJECT_CLASS(sp_color_wheel_selector_parent_class)->dispose)
+ G_OBJECT_CLASS(sp_color_wheel_selector_parent_class)->dispose(object);
}
static void
diff --git a/src/widgets/sp-color-wheel-selector.h b/src/widgets/sp-color-wheel-selector.h
index bbd377422..12b060dbe 100644
--- a/src/widgets/sp-color-wheel-selector.h
+++ b/src/widgets/sp-color-wheel-selector.h
@@ -1,15 +1,12 @@
#ifndef SEEN_SP_COLOR_WHEEL_SELECTOR_H
#define SEEN_SP_COLOR_WHEEL_SELECTOR_H
-#include <glib.h>
#include <gtk/gtk.h>
-#include "sp-color-slider.h"
#include "sp-color-selector.h"
-
-
typedef struct _GimpColorWheel GimpColorWheel;
+struct SPColorSlider;
struct SPColorWheelSelector;
struct SPColorWheelSelectorClass;
diff --git a/src/widgets/sp-widget.cpp b/src/widgets/sp-widget.cpp
index 0e2295e36..fdf5ec500 100644
--- a/src/widgets/sp-widget.cpp
+++ b/src/widgets/sp-widget.cpp
@@ -36,8 +36,6 @@ public:
SPWidgetImpl(SPWidget &target);
~SPWidgetImpl();
- static void classInit(SPWidgetClass *klass);
- static void init(SPWidget *widget);
static void dispose(GObject *object);
static void show(GtkWidget *widget);
static void hide(GtkWidget *widget);
@@ -61,64 +59,27 @@ public:
static void changeSelectionCB(Application *inkscape, Selection *selection, SPWidget *spw);
static void setSelectionCB(Application *inkscape, Selection *selection, SPWidget *spw);
- static GtkWidget *constructGlobal(SPWidget *spw, Inkscape::Application *inkscape);
+ static GtkWidget *constructGlobal(SPWidget *spw, InkscapeApplication *inkscape);
void modifySelection(Application *inkscape, Selection *selection, guint flags);
void changeSelection(Application *inkscape, Selection *selection);
void setSelection(Application *inkscape, Selection *selection);
private:
- static GtkBinClass *parentClass;
- static guint signals[LAST_SIGNAL];
-
SPWidget &_target;
};
-
-GtkBinClass *SPWidgetImpl::parentClass = 0;
-guint SPWidgetImpl::signals[LAST_SIGNAL] = {0};
-
} // namespace Inkscape
-GType SPWidget::getType()
-{
- static GType type = 0;
- if (!type) {
- static GTypeInfo const info = {
- sizeof(SPWidgetClass),
- NULL, NULL,
- reinterpret_cast<GClassInitFunc>(SPWidgetImpl::classInit),
- NULL, NULL,
- sizeof(SPWidget),
- 0,
- reinterpret_cast<GInstanceInitFunc>(SPWidgetImpl::init),
- NULL
- };
- type = g_type_register_static(GTK_TYPE_BIN,
- "SPWidget",
- &info,
- static_cast<GTypeFlags>(0));
- }
- return type;
-}
+G_DEFINE_TYPE(SPWidget, sp_widget, GTK_TYPE_BIN);
-namespace Inkscape {
+static guint signals[LAST_SIGNAL] = {0};
-SPWidgetImpl::SPWidgetImpl(SPWidget &target) :
- _target(target)
-{
-}
-
-SPWidgetImpl::~SPWidgetImpl()
-{
-}
-
-void SPWidgetImpl::classInit(SPWidgetClass *klass)
+static void
+sp_widget_class_init(SPWidgetClass *klass)
{
GObjectClass *object_class = reinterpret_cast<GObjectClass *>(klass);
GtkWidgetClass *widget_class = reinterpret_cast<GtkWidgetClass *>(klass);
- parentClass = reinterpret_cast<GtkBinClass *>(g_type_class_peek_parent(klass));
-
object_class->dispose = SPWidgetImpl::dispose;
signals[CONSTRUCT] = g_signal_new ("construct",
@@ -169,13 +130,23 @@ void SPWidgetImpl::classInit(SPWidgetClass *klass)
widget_class->size_allocate = SPWidgetImpl::sizeAllocate;
}
-void SPWidgetImpl::init(SPWidget *spw)
+static void sp_widget_init(SPWidget *spw)
{
spw->inkscape = NULL;
-
spw->_impl = new SPWidgetImpl(*spw); // ctor invoked after all other init
}
+namespace Inkscape {
+
+SPWidgetImpl::SPWidgetImpl(SPWidget &target) :
+ _target(target)
+{
+}
+
+SPWidgetImpl::~SPWidgetImpl()
+{
+}
+
void SPWidgetImpl::dispose(GObject *object)
{
SPWidget *spw = reinterpret_cast<SPWidget *>(object);
@@ -194,8 +165,8 @@ void SPWidgetImpl::dispose(GObject *object)
delete spw->_impl;
spw->_impl = 0;
- if (reinterpret_cast<GObjectClass *>(parentClass)->dispose) {
- (*reinterpret_cast<GObjectClass *>(parentClass)->dispose)(object);
+ if (G_OBJECT_CLASS(sp_widget_parent_class)->dispose) {
+ G_OBJECT_CLASS(sp_widget_parent_class)->dispose(object);
}
}
@@ -210,8 +181,8 @@ void SPWidgetImpl::show(GtkWidget *widget)
g_signal_connect(spw->inkscape, "set_selection", G_CALLBACK(SPWidgetImpl::setSelectionCB), spw);
}
- if (reinterpret_cast<GtkWidgetClass *>(parentClass)->show) {
- (*reinterpret_cast<GtkWidgetClass *>(parentClass)->show)(widget);
+ if (GTK_WIDGET_CLASS(sp_widget_parent_class)->show) {
+ GTK_WIDGET_CLASS(sp_widget_parent_class)->show(widget);
}
}
@@ -224,8 +195,8 @@ void SPWidgetImpl::hide(GtkWidget *widget)
sp_signal_disconnect_by_data(spw->inkscape, spw);
}
- if (reinterpret_cast<GtkWidgetClass *>(parentClass)->hide) {
- (*reinterpret_cast<GtkWidgetClass *>(parentClass)->hide)(widget);
+ if (GTK_WIDGET_CLASS(sp_widget_parent_class)->hide) {
+ GTK_WIDGET_CLASS(sp_widget_parent_class)->hide(widget);
}
}
@@ -293,7 +264,7 @@ void SPWidgetImpl::sizeAllocate(GtkWidget *widget, GtkAllocation *allocation)
}
}
-GtkWidget *SPWidgetImpl::constructGlobal(SPWidget *spw, Inkscape::Application *inkscape)
+GtkWidget *SPWidgetImpl::constructGlobal(SPWidget *spw, InkscapeApplication *inkscape)
{
g_return_val_if_fail(!spw->inkscape, NULL);
@@ -345,7 +316,7 @@ void SPWidgetImpl::setSelection(Application * /*inkscape*/, Selection *selection
// Methods
-GtkWidget *sp_widget_new_global(Inkscape::Application *inkscape)
+GtkWidget *sp_widget_new_global(InkscapeApplication *inkscape)
{
SPWidget *spw = reinterpret_cast<SPWidget*>(g_object_new(SP_TYPE_WIDGET, NULL));
diff --git a/src/widgets/sp-widget.h b/src/widgets/sp-widget.h
index 3a23a92c5..6227c3a72 100644
--- a/src/widgets/sp-widget.h
+++ b/src/widgets/sp-widget.h
@@ -15,35 +15,27 @@
* Released under GNU GPL, read the file 'COPYING' for more information
*/
-#include <glib.h>
#include <gtk/gtk.h>
-#define SP_TYPE_WIDGET (SPWidget::getType())
+#define SP_TYPE_WIDGET (sp_widget_get_type())
#define SP_WIDGET(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), SP_TYPE_WIDGET, SPWidget))
#define SP_WIDGET_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), SP_TYPE_WIDGET, SPWidgetClass))
#define SP_IS_WIDGET(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), SP_TYPE_WIDGET))
#define SP_IS_WIDGET_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), SP_TYPE_WIDGET))
+struct InkscapeApplication;
namespace Inkscape {
-
-struct Application;
class Selection;
class SPWidgetImpl;
-
}
struct SPWidget {
friend class Inkscape::SPWidgetImpl;
- static GType getType();
-
- //
-
GtkBin bin;
- Inkscape::Application *inkscape;
+ InkscapeApplication *inkscape;
-private:
Inkscape::SPWidgetImpl *_impl;
};
@@ -58,10 +50,10 @@ struct SPWidgetClass {
void (* set_selection) (SPWidget *spw, Inkscape::Selection *selection);
};
-/* fixme: Think (Lauris) */
+GType sp_widget_get_type();
/** Generic constructor for global widget. */
-GtkWidget *sp_widget_new_global(Inkscape::Application *inkscape);
+GtkWidget *sp_widget_new_global(InkscapeApplication *inkscape);
#endif // SEEN_SP_WIDGET_H
/*
diff --git a/src/widgets/sp-xmlview-attr-list.cpp b/src/widgets/sp-xmlview-attr-list.cpp
index 47b0ebb9d..dd763aea5 100644
--- a/src/widgets/sp-xmlview-attr-list.cpp
+++ b/src/widgets/sp-xmlview-attr-list.cpp
@@ -20,9 +20,6 @@
#include "../xml/node-event-vector.h"
#include "sp-xmlview-attr-list.h"
-static void sp_xmlview_attr_list_class_init (SPXMLViewAttrListClass * klass);
-static void sp_xmlview_attr_list_init (SPXMLViewAttrList * list);
-
#if GTK_CHECK_VERSION(3,0,0)
static void sp_xmlview_attr_list_destroy(GtkWidget * object);
#else
@@ -31,8 +28,6 @@ static void sp_xmlview_attr_list_destroy(GtkObject * object);
static void event_attr_changed (Inkscape::XML::Node * repr, const gchar * name, const gchar * old_value, const gchar * new_value, bool is_interactive, gpointer data);
-static GtkTreeViewClass * parent_class = NULL;
-
static Inkscape::XML::NodeEventVector repr_events = {
NULL, /* child_added */
NULL, /* child_removed */
@@ -88,28 +83,7 @@ sp_xmlview_attr_list_set_repr (SPXMLViewAttrList * list, Inkscape::XML::Node * r
}
}
-GType sp_xmlview_attr_list_get_type(void)
-{
- static GType type = 0;
-
- if (!type) {
- GTypeInfo info = {
- sizeof(SPXMLViewAttrListClass),
- 0, // base_init
- 0, // base_finalize
- (GClassInitFunc)sp_xmlview_attr_list_class_init,
- 0, // class_finalize
- 0, // class_data
- sizeof(SPXMLViewAttrList),
- 0, // n_preallocs
- (GInstanceInitFunc)sp_xmlview_attr_list_init,
- 0 // value_table
- };
- type = g_type_register_static(GTK_TYPE_TREE_VIEW, "SPXMLViewAttrList", &info, static_cast<GTypeFlags>(0));
- }
-
- return type;
-}
+G_DEFINE_TYPE(SPXMLViewAttrList, sp_xmlview_attr_list, GTK_TYPE_TREE_VIEW);
void sp_xmlview_attr_list_class_init (SPXMLViewAttrListClass * klass)
{
@@ -121,8 +95,6 @@ void sp_xmlview_attr_list_class_init (SPXMLViewAttrListClass * klass)
object_class->destroy = sp_xmlview_attr_list_destroy;
#endif
- parent_class = GTK_TREE_VIEW_CLASS(g_type_class_peek_parent (klass));
-
g_signal_new("row-value-changed",
G_TYPE_FROM_CLASS(klass),
G_SIGNAL_RUN_FIRST,
@@ -154,9 +126,9 @@ void sp_xmlview_attr_list_destroy(GtkObject * object)
sp_xmlview_attr_list_set_repr (list, NULL);
#if GTK_CHECK_VERSION(3,0,0)
- GTK_WIDGET_CLASS(parent_class)->destroy (object);
+ GTK_WIDGET_CLASS(sp_xmlview_attr_list_parent_class)->destroy (object);
#else
- GTK_OBJECT_CLASS(parent_class)->destroy (object);
+ GTK_OBJECT_CLASS(sp_xmlview_attr_list_parent_class)->destroy (object);
#endif
}
diff --git a/src/widgets/sp-xmlview-attr-list.h b/src/widgets/sp-xmlview-attr-list.h
index 367ef1a12..08b115bfa 100644
--- a/src/widgets/sp-xmlview-attr-list.h
+++ b/src/widgets/sp-xmlview-attr-list.h
@@ -12,10 +12,8 @@
* Released under the GNU GPL; see COPYING for details
*/
-#include <stdio.h>
#include <gtk/gtk.h>
-
#define SP_TYPE_XMLVIEW_ATTR_LIST (sp_xmlview_attr_list_get_type ())
#define SP_XMLVIEW_ATTR_LIST(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), SP_TYPE_XMLVIEW_ATTR_LIST, SPXMLViewAttrList))
#define SP_IS_XMLVIEW_ATTR_LIST(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), SP_TYPE_XMLVIEW_ATTR_LIST))
@@ -23,7 +21,6 @@
struct SPXMLViewAttrList
{
-
GtkTreeView list;
GtkListStore *store;
diff --git a/src/widgets/sp-xmlview-content.cpp b/src/widgets/sp-xmlview-content.cpp
index ac64dabdb..9243760bd 100644
--- a/src/widgets/sp-xmlview-content.cpp
+++ b/src/widgets/sp-xmlview-content.cpp
@@ -23,9 +23,6 @@
using Inkscape::DocumentUndo;
-static void sp_xmlview_content_class_init (SPXMLViewContentClass * klass);
-static void sp_xmlview_content_init (SPXMLViewContent * text);
-
#if GTK_CHECK_VERSION(3,0,0)
static void sp_xmlview_content_destroy(GtkWidget * object);
#else
@@ -36,8 +33,6 @@ void sp_xmlview_content_changed (GtkTextBuffer *tb, SPXMLViewContent *text);
static void event_content_changed (Inkscape::XML::Node * repr, const gchar * old_content, const gchar * new_content, gpointer data);
-static GtkTextViewClass * parent_class = NULL;
-
static Inkscape::XML::NodeEventVector repr_events = {
NULL, /* child_added */
NULL, /* child_removed */
@@ -81,28 +76,7 @@ sp_xmlview_content_set_repr (SPXMLViewContent * text, Inkscape::XML::Node * repr
}
}
-GType sp_xmlview_content_get_type(void)
-{
- static GType type = 0;
-
- if (!type) {
- GTypeInfo info = {
- sizeof(SPXMLViewContentClass),
- 0, // base_init
- 0, // base_finalize
- (GClassInitFunc)sp_xmlview_content_class_init,
- 0, // class_finalize
- 0, // class_data
- sizeof(SPXMLViewContent),
- 0, // n_preallocs
- (GInstanceInitFunc)sp_xmlview_content_init,
- 0 // value_table
- };
- type = g_type_register_static(GTK_TYPE_TEXT_VIEW, "SPXMLViewContent", &info, static_cast<GTypeFlags>(0));
- }
-
- return type;
-}
+G_DEFINE_TYPE(SPXMLViewContent, sp_xmlview_content, GTK_TYPE_TEXT_VIEW);
void sp_xmlview_content_class_init(SPXMLViewContentClass * klass)
{
@@ -113,8 +87,6 @@ void sp_xmlview_content_class_init(SPXMLViewContentClass * klass)
GtkObjectClass * object_class = GTK_OBJECT_CLASS(klass);
object_class->destroy = sp_xmlview_content_destroy;
#endif
-
- parent_class = GTK_TEXT_VIEW_CLASS(g_type_class_peek_parent (klass));
}
void
@@ -135,9 +107,9 @@ void sp_xmlview_content_destroy(GtkObject * object)
sp_xmlview_content_set_repr (text, NULL);
#if GTK_CHECK_VERSION(3,0,0)
- GTK_WIDGET_CLASS (parent_class)->destroy (object);
+ GTK_WIDGET_CLASS (sp_xmlview_content_parent_class)->destroy (object);
#else
- GTK_OBJECT_CLASS (parent_class)->destroy (object);
+ GTK_OBJECT_CLASS (sp_xmlview_content_parent_class)->destroy (object);
#endif
}
diff --git a/src/widgets/sp-xmlview-content.h b/src/widgets/sp-xmlview-content.h
index 8b1342c5e..140eacf46 100644
--- a/src/widgets/sp-xmlview-content.h
+++ b/src/widgets/sp-xmlview-content.h
@@ -13,10 +13,7 @@
*/
#include <config.h>
-#include <stdio.h>
#include <gtk/gtk.h>
-#include <glib.h>
-
#define SP_TYPE_XMLVIEW_CONTENT (sp_xmlview_content_get_type ())
#define SP_XMLVIEW_CONTENT(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), SP_TYPE_XMLVIEW_CONTENT, SPXMLViewContent))
diff --git a/src/widgets/sp-xmlview-tree.cpp b/src/widgets/sp-xmlview-tree.cpp
index 43b7dc289..5dff9adf3 100644
--- a/src/widgets/sp-xmlview-tree.cpp
+++ b/src/widgets/sp-xmlview-tree.cpp
@@ -1,6 +1,4 @@
-#define __SP_XMLVIEW_TREE_C__
-
-/*
+/**
* Specialization of GtkTreeView for the XML tree view
*
* Authors:
@@ -14,7 +12,7 @@
#include <cstring>
#include <string>
-#include "../xml/node-event-vector.h"
+#include "xml/node-event-vector.h"
#include "sp-xmlview-tree.h"
struct NodeData {
@@ -25,9 +23,6 @@ struct NodeData {
enum { STORE_TEXT_COL = 0, STORE_DATA_COL, STORE_REPR_COL, STORE_N_COLS };
-static void sp_xmlview_tree_class_init (SPXMLViewTreeClass * klass);
-static void sp_xmlview_tree_init (SPXMLViewTree * tree);
-
#if GTK_CHECK_VERSION(3,0,0)
static void sp_xmlview_tree_destroy(GtkWidget * object);
#else
@@ -92,8 +87,6 @@ static const Inkscape::XML::NodeEventVector pi_repr_events = {
NULL /* order_changed */
};
-static GtkTreeViewClass * parent_class = NULL;
-
GtkWidget *sp_xmlview_tree_new(Inkscape::XML::Node * repr, void * /*factory*/, void * /*data*/)
{
SPXMLViewTree *tree = SP_XMLVIEW_TREE(g_object_new (SP_TYPE_XMLVIEW_TREE, NULL));
@@ -124,28 +117,7 @@ GtkWidget *sp_xmlview_tree_new(Inkscape::XML::Node * repr, void * /*factory*/, v
return GTK_WIDGET(tree);
}
-GType
-sp_xmlview_tree_get_type (void)
-{
- static GType type = 0;
-
- if (!type) {
- static const GTypeInfo info = {
- sizeof (SPXMLViewTreeClass),
- NULL, NULL,
- (GClassInitFunc) sp_xmlview_tree_class_init,
- NULL, NULL,
- sizeof (SPXMLViewTree),
- 0,
- (GInstanceInitFunc) sp_xmlview_tree_init,
- NULL
- };
- type = g_type_register_static (GTK_TYPE_TREE_VIEW, "SPXMLViewTree", &info, (GTypeFlags)0);
- }
-
-
- return type;
-}
+G_DEFINE_TYPE(SPXMLViewTree, sp_xmlview_tree, GTK_TYPE_TREE_VIEW);
void sp_xmlview_tree_class_init(SPXMLViewTreeClass * klass)
{
@@ -157,8 +129,6 @@ void sp_xmlview_tree_class_init(SPXMLViewTreeClass * klass)
object_class->destroy = sp_xmlview_tree_destroy;
#endif
- parent_class = GTK_TREE_VIEW_CLASS(g_type_class_peek_parent (klass));
-
// Signal for when a tree drag and drop has completed
g_signal_new ( "tree_move",
G_TYPE_FROM_CLASS(klass),
@@ -190,9 +160,9 @@ void sp_xmlview_tree_destroy(GtkObject * object)
sp_xmlview_tree_set_repr (tree, NULL);
#if GTK_CHECK_VERSION(3,0,0)
- GTK_WIDGET_CLASS(parent_class)->destroy (object);
+ GTK_WIDGET_CLASS(sp_xmlview_tree_parent_class)->destroy (object);
#else
- GTK_OBJECT_CLASS(parent_class)->destroy (object);
+ GTK_OBJECT_CLASS(sp_xmlview_tree_parent_class)->destroy (object);
#endif
}
@@ -734,4 +704,4 @@ gboolean search_equal_func(GtkTreeModel *model, gint /*column*/, const gchar *ke
fill-column:99
End:
*/
-// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8 :
diff --git a/src/widgets/sp-xmlview-tree.h b/src/widgets/sp-xmlview-tree.h
index 69228fa88..7ecbcb471 100644
--- a/src/widgets/sp-xmlview-tree.h
+++ b/src/widgets/sp-xmlview-tree.h
@@ -1,9 +1,4 @@
-#ifndef __SP_XMLVIEW_TREE_H__
-#define __SP_XMLVIEW_TREE_H__
-
-/*
- * Specialization of GtkTreeView for the XML editor
- *
+/**
* Authors:
* MenTaLguY <mental@rydia.net>
*
@@ -12,9 +7,15 @@
* Released under the GNU GPL; see COPYING for details
*/
+#ifndef SEEN_SP_XMLVIEW_TREE_H
+#define SEEN_SP_XMLVIEW_TREE_H
+
#include <gtk/gtk.h>
#include <glib.h>
+/**
+ * Specialization of GtkTreeView for the XML editor
+ */
#define SP_TYPE_XMLVIEW_TREE (sp_xmlview_tree_get_type ())
#define SP_XMLVIEW_TREE(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), SP_TYPE_XMLVIEW_TREE, SPXMLViewTree))
@@ -49,7 +50,7 @@ Inkscape::XML::Node * sp_xmlview_tree_node_get_repr (GtkTreeModel *model, GtkTre
gboolean sp_xmlview_tree_get_repr_node (SPXMLViewTree * tree, Inkscape::XML::Node * repr, GtkTreeIter *node);
-#endif
+#endif // !SEEN_SP_XMLVIEW_TREE_H
/*
Local Variables:
@@ -60,4 +61,4 @@ gboolean sp_xmlview_tree_get_repr_node (SPXMLViewTree * tree, Inkscape::XML::Nod
fill-column:99
End:
*/
-// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8 :
diff --git a/src/widgets/spinbutton-events.h b/src/widgets/spinbutton-events.h
index c1df88c8a..9bf50d87c 100644
--- a/src/widgets/spinbutton-events.h
+++ b/src/widgets/spinbutton-events.h
@@ -10,7 +10,9 @@
*/
#include <glib.h>
-#include <gtk/gtk.h> /* GtkWidget */
+
+typedef struct _GdkEventKey GdkEventKey;
+typedef struct _GtkWidget GtkWidget;
gboolean spinbutton_focus_in (GtkWidget *w, GdkEventKey *event, gpointer data);
void spinbutton_undo (GtkWidget *w);
diff --git a/src/widgets/spiral-toolbar.cpp b/src/widgets/spiral-toolbar.cpp
index 710be9440..e85b024ed 100644
--- a/src/widgets/spiral-toolbar.cpp
+++ b/src/widgets/spiral-toolbar.cpp
@@ -34,9 +34,9 @@
#include "desktop-handles.h"
#include "desktop.h"
#include "document-undo.h"
-#include "ege-adjustment-action.h"
-#include "ege-output-action.h"
-#include "ink-action.h"
+#include "widgets/ege-adjustment-action.h"
+#include "widgets/ege-output-action.h"
+#include "widgets/ink-action.h"
#include "preferences.h"
#include "selection.h"
#include "sp-spiral.h"
diff --git a/src/widgets/spray-toolbar.cpp b/src/widgets/spray-toolbar.cpp
index 788ce6475..183814b7e 100644
--- a/src/widgets/spray-toolbar.cpp
+++ b/src/widgets/spray-toolbar.cpp
@@ -33,9 +33,9 @@
#include "spray-toolbar.h"
#include "desktop.h"
#include "document-undo.h"
-#include "ege-adjustment-action.h"
-#include "ege-select-one-action.h"
-#include "ink-action.h"
+#include "widgets/ege-adjustment-action.h"
+#include "widgets/ege-select-one-action.h"
+#include "widgets/ink-action.h"
#include "preferences.h"
#include "toolbox.h"
#include "ui/icon-names.h"
diff --git a/src/widgets/spw-utilities.cpp b/src/widgets/spw-utilities.cpp
index 9c0c8d7c6..f87889bb1 100644
--- a/src/widgets/spw-utilities.cpp
+++ b/src/widgets/spw-utilities.cpp
@@ -64,8 +64,15 @@ Gtk::Label * spw_label(Gtk::Table *table, const gchar *label_text, int col, int
label_widget->set_hexpand();
label_widget->set_halign(Gtk::ALIGN_FILL);
label_widget->set_valign(Gtk::ALIGN_CENTER);
+
+ #if GTK_CHECK_VERSION(3,12,0)
+ label_widget->set_margin_start(4);
+ label_widget->set_margin_end(4);
+ #else
label_widget->set_margin_left(4);
label_widget->set_margin_right(4);
+ #endif
+
table->attach(*label_widget, col, row, 1, 1);
#else
table->attach(*label_widget, col, col+1, row, row+1, (Gtk::EXPAND | Gtk::FILL), static_cast<Gtk::AttachOptions>(0), 4, 0);
@@ -238,7 +245,11 @@ sp_set_font_size_recursive (GtkWidget *w, gpointer font)
PangoFontDescription* pan = pango_font_description_new ();
pango_font_description_set_size (pan, size);
+#if GTK_CHECK_VERSION(3,0,0)
+ gtk_widget_override_font (w, pan);
+#else
gtk_widget_modify_font (w, pan);
+#endif
if (GTK_IS_CONTAINER(w)) {
gtk_container_foreach (GTK_CONTAINER(w), (GtkCallback) sp_set_font_size_recursive, font);
diff --git a/src/widgets/star-toolbar.cpp b/src/widgets/star-toolbar.cpp
index 7a7d0dc71..6213263fc 100644
--- a/src/widgets/star-toolbar.cpp
+++ b/src/widgets/star-toolbar.cpp
@@ -34,14 +34,15 @@
#include "desktop-handles.h"
#include "desktop.h"
#include "document-undo.h"
-#include "ege-adjustment-action.h"
-#include "ege-output-action.h"
-#include "ege-select-one-action.h"
-#include "ink-action.h"
+#include "widgets/ege-adjustment-action.h"
+#include "widgets/ege-output-action.h"
+#include "widgets/ege-select-one-action.h"
+#include "widgets/ink-action.h"
#include "selection.h"
#include "sp-star.h"
#include "toolbox.h"
#include "ui/icon-names.h"
+#include "ui/tools/star-tool.h"
#include "ui/uxmanager.h"
#include "verbs.h"
#include "widgets/../preferences.h"
@@ -435,6 +436,7 @@ static void sp_stb_defaults( GtkWidget * /*widget*/, GObject *dataKludge )
gtk_adjustment_value_changed(adj);
}
+static void star_toolbox_watch_ec(SPDesktop* dt, Inkscape::UI::Tools::ToolBase* ec, GObject* holder);
void sp_star_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainActions, GObject* holder)
{
@@ -571,15 +573,22 @@ void sp_star_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainActions, GObje
}
}
- sigc::connection *connection = new sigc::connection(
- sp_desktop_selection(desktop)->connectChanged(sigc::bind(sigc::ptr_fun(sp_star_toolbox_selection_changed), holder))
- );
- g_signal_connect( holder, "destroy", G_CALLBACK(delete_connection), connection );
- g_signal_connect( holder, "destroy", G_CALLBACK(purge_repr_listener), holder );
+ desktop->connectEventContextChanged(sigc::bind(sigc::ptr_fun(star_toolbox_watch_ec), holder));
+ g_signal_connect(holder, "destroy", G_CALLBACK(purge_repr_listener), holder);
}
+static void star_toolbox_watch_ec(SPDesktop* desktop, Inkscape::UI::Tools::ToolBase* ec, GObject* holder)
+{
+ static sigc::connection changed;
-
+ if (dynamic_cast<Inkscape::UI::Tools::StarTool const*>(ec) != NULL) {
+ changed = sp_desktop_selection(desktop)->connectChanged(sigc::bind(sigc::ptr_fun(sp_star_toolbox_selection_changed), holder));
+ sp_star_toolbox_selection_changed(sp_desktop_selection(desktop), holder);
+ } else {
+ if (changed)
+ changed.disconnect();
+ }
+}
/*
Local Variables:
@@ -590,4 +599,4 @@ void sp_star_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainActions, GObje
fill-column:99
End:
*/
-// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8 :
diff --git a/src/widgets/stroke-marker-selector.cpp b/src/widgets/stroke-marker-selector.cpp
index a0121b799..23da54e94 100644
--- a/src/widgets/stroke-marker-selector.cpp
+++ b/src/widgets/stroke-marker-selector.cpp
@@ -25,13 +25,13 @@
#include "style.h"
-#include "dialogs/dialog-events.h"
+#include "ui/dialog-events.h"
#include "desktop-handles.h"
#include "desktop-style.h"
#include "preferences.h"
#include "path-prefix.h"
#include "io/sys.h"
-#include "marker.h"
+#include "sp-marker.h"
#include "sp-defs.h"
#include "sp-root.h"
#include "ui/cache/svg_preview_cache.h"
diff --git a/src/widgets/stroke-style.cpp b/src/widgets/stroke-style.cpp
index 7477e07ca..02dd5df6e 100644
--- a/src/widgets/stroke-style.cpp
+++ b/src/widgets/stroke-style.cpp
@@ -18,7 +18,7 @@
#define noSP_SS_VERBOSE
#include "stroke-style.h"
-#include "../gradient-chemistry.h"
+#include "gradient-chemistry.h"
#include "sp-gradient.h"
#include "sp-stop.h"
#include "svg/svg-color.h"
diff --git a/src/widgets/stroke-style.h b/src/widgets/stroke-style.h
index 6f0fe583b..15e394097 100644
--- a/src/widgets/stroke-style.h
+++ b/src/widgets/stroke-style.h
@@ -12,6 +12,8 @@
* Released under GNU GPL, read the file 'COPYING' for more information
*/
+// WHOA! talk about header bloat!
+
#ifndef SEEN_DIALOGS_STROKE_STYLE_H
#define SEEN_DIALOGS_STROKE_STYLE_H
@@ -33,7 +35,7 @@
#include "desktop.h"
#include "desktop-handles.h"
#include "desktop-style.h"
-#include "dialogs/dialog-events.h"
+#include "ui/dialog-events.h"
#include "display/canvas-bpath.h" // for SP_STROKE_LINEJOIN_*
#include "display/drawing.h"
#include "document-private.h"
@@ -42,7 +44,7 @@
#include "helper/stock-items.h"
#include "inkscape.h"
#include "io/sys.h"
-#include "marker.h"
+#include "sp-marker.h"
#include "preferences.h"
#include "path-prefix.h"
#include "selection.h"
diff --git a/src/widgets/text-toolbar.cpp b/src/widgets/text-toolbar.cpp
index 2697beb8a..d62bb8027 100644
--- a/src/widgets/text-toolbar.cpp
+++ b/src/widgets/text-toolbar.cpp
@@ -36,10 +36,10 @@
#include "desktop.h"
#include "document-undo.h"
#include "document.h"
-#include "ege-adjustment-action.h"
-#include "ege-select-one-action.h"
-#include "ink-action.h"
-#include "ink-comboboxentry-action.h"
+#include "widgets/ege-adjustment-action.h"
+#include "widgets/ege-select-one-action.h"
+#include "widgets/ink-action.h"
+#include "widgets/ink-comboboxentry-action.h"
#include "inkscape.h"
#include "preferences.h"
#include "selection-chemistry.h"
@@ -1663,4 +1663,4 @@ static void text_toolbox_watch_ec(SPDesktop* desktop, Inkscape::UI::Tools::ToolB
fill-column:99
End:
*/
-// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8 :
diff --git a/src/widgets/toolbox.cpp b/src/widgets/toolbox.cpp
index 939546f78..9e55d1cf6 100644
--- a/src/widgets/toolbox.cpp
+++ b/src/widgets/toolbox.cpp
@@ -43,20 +43,20 @@
#include "../desktop-handles.h"
#include "../desktop-style.h"
#include "document-undo.h"
-#include "../ege-adjustment-action.h"
-#include "../ege-output-action.h"
-#include "../ege-select-one-action.h"
+#include "widgets/ege-adjustment-action.h"
+#include "widgets/ege-output-action.h"
+#include "widgets/ege-select-one-action.h"
#include "../graphlayout.h"
#include "../helper/action.h"
#include "../helper/action-context.h"
#include "icon.h"
-#include "../ink-action.h"
-#include "../ink-comboboxentry-action.h"
+#include "ink-action.h"
+#include "ink-comboboxentry-action.h"
#include "../inkscape.h"
-#include "../interface.h"
+#include "ui/interface.h"
#include "../shortcuts.h"
#include "../sp-namedview.h"
-#include "../tools-switch.h"
+#include "ui/tools-switch.h"
#include "../ui/icon-names.h"
#include "../ui/widget/style-swatch.h"
#include "../verbs.h"
diff --git a/src/widgets/toolbox.h b/src/widgets/toolbox.h
index fb749bfb5..db9130034 100644
--- a/src/widgets/toolbox.h
+++ b/src/widgets/toolbox.h
@@ -13,15 +13,15 @@
* Released under GNU GPL, read the file 'COPYING' for more information
*/
-#include <gtk/gtk.h>
#include <glibmm/ustring.h>
#include "icon-size.h"
-#include "../ege-adjustment-action.h"
-#include "../preferences.h"
+#include "preferences.h"
#define TOOLBAR_SLIDER_HINT "full"
+typedef struct _EgeAdjustmentAction EgeAdjustmentAction;
+
class SPDesktop;
namespace Inkscape {
diff --git a/src/widgets/tweak-toolbar.cpp b/src/widgets/tweak-toolbar.cpp
index 050d7fb5e..a5d90fc3d 100644
--- a/src/widgets/tweak-toolbar.cpp
+++ b/src/widgets/tweak-toolbar.cpp
@@ -33,10 +33,10 @@
#include "tweak-toolbar.h"
#include "desktop.h"
#include "document-undo.h"
-#include "ege-adjustment-action.h"
-#include "ege-output-action.h"
-#include "ege-select-one-action.h"
-#include "ink-action.h"
+#include "widgets/ege-adjustment-action.h"
+#include "widgets/ege-output-action.h"
+#include "widgets/ege-select-one-action.h"
+#include "widgets/ink-action.h"
#include "preferences.h"
#include "toolbox.h"
#include "ui/icon-names.h"
diff --git a/src/xml/event.h b/src/xml/event.h
index 55e2add88..d25ea0e07 100644
--- a/src/xml/event.h
+++ b/src/xml/event.h
@@ -18,7 +18,7 @@
#ifndef SEEN_INKSCAPE_XML_SP_REPR_ACTION_H
#define SEEN_INKSCAPE_XML_SP_REPR_ACTION_H
-#include <glib.h>
+typedef unsigned int GQuark;
#include <glibmm/ustring.h>
#include <iterator>
diff --git a/src/xml/helper-observer.h b/src/xml/helper-observer.h
index 2f70ba792..b4c0aba41 100644
--- a/src/xml/helper-observer.h
+++ b/src/xml/helper-observer.h
@@ -1,37 +1,49 @@
-#ifndef __XML_HELPER_OBSERVER__
-#define __XML_HELPER_OBSERVER__
+#ifndef SEEN_XML_HELPER_OBSERVER
+#define SEEN_XML_HELPER_OBSERVER
+
+#include <cstddef>
+#include <sigc++/sigc++.h>
#include "node-observer.h"
#include "node.h"
-#include "../sp-object.h"
-//#include "../sp-object-repr.h"
-#include <stddef.h>
-#include <sigc++/sigc++.h>
+#include "sp-object.h"
namespace Inkscape {
- namespace XML {
- class Node;
-
- // Very simple observer that just emits a signal if anything happens to a node
- class SignalObserver : public NodeObserver
- {
- public:
- SignalObserver();
- ~SignalObserver();
-
- // Add this observer to the SPObject and remove it from any previous object
- void set(SPObject* o);
- void notifyChildAdded(Node&, Node&, Node*);
- void notifyChildRemoved(Node&, Node&, Node*);
- void notifyChildOrderChanged(Node&, Node&, Node*, Node*);
- void notifyContentChanged(Node&, Util::ptr_shared<char>, Util::ptr_shared<char>);
- void notifyAttributeChanged(Node&, GQuark, Util::ptr_shared<char>, Util::ptr_shared<char>);
- sigc::signal<void>& signal_changed();
- private:
- sigc::signal<void> _signal_changed;
- SPObject* _oldsel;
- };
- }
+namespace XML {
+
+class Node;
+
+// Very simple observer that just emits a signal if anything happens to a node
+class SignalObserver : public NodeObserver {
+public:
+ SignalObserver();
+ ~SignalObserver();
+
+ // Add this observer to the SPObject and remove it from any previous object
+ void set(SPObject* o);
+ void notifyChildAdded(Node&, Node&, Node*);
+ void notifyChildRemoved(Node&, Node&, Node*);
+ void notifyChildOrderChanged(Node&, Node&, Node*, Node*);
+ void notifyContentChanged(Node&, Util::ptr_shared<char>, Util::ptr_shared<char>);
+ void notifyAttributeChanged(Node&, GQuark, Util::ptr_shared<char>, Util::ptr_shared<char>);
+ sigc::signal<void>& signal_changed();
+private:
+ sigc::signal<void> _signal_changed;
+ SPObject* _oldsel;
+};
+
+}
}
#endif //#ifndef __XML_HELPER_OBSERVER__
+
+/*
+ Local Variables:
+ mode:c++
+ c-file-style:"stroustrup"
+ c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
+ indent-tabs-mode:nil
+ fill-column:99
+ End:
+*/
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8 :
diff --git a/src/xml/node-event-vector.h b/src/xml/node-event-vector.h
index e6396877d..16add2960 100644
--- a/src/xml/node-event-vector.h
+++ b/src/xml/node-event-vector.h
@@ -14,26 +14,11 @@
#ifndef SEEN_INKSCAPE_XML_SP_REPR_EVENT_VECTOR
#define SEEN_INKSCAPE_XML_SP_REPR_EVENT_VECTOR
-#include <glib.h>
-
#include "xml/node.h"
namespace Inkscape {
namespace XML {
-
-/**
- * @brief Structure holding callbacks for node state changes
- * @deprecated Derive an observer object from the NodeObserver class instead
- */
-struct NodeEventVector {
- /* Immediate signals */
- void (* child_added) (Node *repr, Node *child, Node *ref, void * data);
- void (* child_removed) (Node *repr, Node *child, Node *ref, void * data);
- void (* attr_changed) (Node *repr, const gchar *key, const gchar *oldval, const gchar *newval, bool is_interactive, void * data);
- void (* content_changed) (Node *repr, const gchar *oldcontent, const gchar *newcontent, void * data);
- void (* order_changed) (Node *repr, Node *child, Node *oldref, Node *newref, void * data);
-};
-
+struct NodeEventVector;
}
}
@@ -41,22 +26,41 @@ struct NodeEventVector {
* @brief Generate events corresponding to the node's state
* @deprecated Use Node::synthesizeEvents(NodeObserver &) instead
*/
-inline void sp_repr_synthesize_events (Inkscape::XML::Node *repr, const Inkscape::XML::NodeEventVector *vector, void * data) {
+inline void sp_repr_synthesize_events (Inkscape::XML::Node *repr, const Inkscape::XML::NodeEventVector *vector, void* data) {
repr->synthesizeEvents(vector, data);
}
/**
* @brief Add a set of callbacks for node state changes and its associated data
* @deprecated Use Node::addObserver() instead
*/
-inline void sp_repr_add_listener (Inkscape::XML::Node *repr, const Inkscape::XML::NodeEventVector *vector, void * data) {
+inline void sp_repr_add_listener (Inkscape::XML::Node *repr, const Inkscape::XML::NodeEventVector *vector, void* data) {
repr->addListener(vector, data);
}
/**
* @brief Remove a set of callbacks based on associated data
* @deprecated Use Node::removeObserver() instead
*/
-inline void sp_repr_remove_listener_by_data (Inkscape::XML::Node *repr, void * data) {
+inline void sp_repr_remove_listener_by_data (Inkscape::XML::Node *repr, void* data) {
repr->removeListenerByData(data);
}
+namespace Inkscape {
+namespace XML {
+
+/**
+ * @brief Structure holding callbacks for node state changes
+ * @deprecated Derive an observer object from the NodeObserver class instead
+ */
+struct NodeEventVector {
+ /* Immediate signals */
+ void (* child_added) (Node *repr, Node *child, Node *ref, void* data);
+ void (* child_removed) (Node *repr, Node *child, Node *ref, void* data);
+ void (* attr_changed) (Node *repr, char const *key, char const *oldval, char const *newval, bool is_interactive, void* data);
+ void (* content_changed) (Node *repr, char const *oldcontent, char const *newcontent, void * data);
+ void (* order_changed) (Node *repr, Node *child, Node *oldref, Node *newref, void* data);
+};
+
+}
+}
+
#endif
diff --git a/src/xml/node-observer.h b/src/xml/node-observer.h
index d0c85d1dd..9c7e096e5 100644
--- a/src/xml/node-observer.h
+++ b/src/xml/node-observer.h
@@ -18,8 +18,8 @@
#ifndef SEEN_INKSCAPE_XML_NODE_OBSERVER_H
#define SEEN_INKSCAPE_XML_NODE_OBSERVER_H
-#include <glib.h>
#include "util/share.h"
+typedef unsigned int GQuark;
#ifndef INK_UNUSED
#define INK_UNUSED(x) ((void)(x))
@@ -56,7 +56,9 @@ protected:
NodeObserver() {}
public:
virtual ~NodeObserver() {}
-
+
+ // FIXME: somebody needs to learn what "pure virtual" means
+
/**
* @brief Child addition callback
*
diff --git a/src/xml/node.h b/src/xml/node.h
index c1977b0a8..8bb70acc0 100644
--- a/src/xml/node.h
+++ b/src/xml/node.h
@@ -18,7 +18,6 @@
#ifndef SEEN_INKSCAPE_XML_NODE_H
#define SEEN_INKSCAPE_XML_NODE_H
-#include <glibmm/value.h>
#include <glibmm/ustring.h>
#include "gc-anchored.h"
#include "util/list.h"
@@ -100,7 +99,7 @@ public:
*
* @return Name for element nodes, NULL for others
*/
- virtual gchar const *name() const=0;
+ virtual char const *name() const=0;
/**
* @brief Get the integer code corresponding to the node's name
* @return GQuark code corresponding to the name
@@ -131,7 +130,7 @@ public:
*
* @return The node's content
*/
- virtual gchar const *content() const=0;
+ virtual char const *content() const=0;
/**
* @brief Get the string representation of a node's attribute
@@ -144,7 +143,7 @@ public:
*
* @param key The name of the node's attribute
*/
- virtual gchar const *attribute(gchar const *key) const=0;
+ virtual char const *attribute(char const *key) const=0;
/**
* @brief Get a list of the node's attributes
@@ -168,7 +167,7 @@ public:
* @param partial_name The string to match against all attributes
* @return true if there is such an attribute, false otherwise
*/
- virtual bool matchAttributeName(gchar const *partial_name) const=0;
+ virtual bool matchAttributeName(char const *partial_name) const=0;
/*@}*/
@@ -193,7 +192,7 @@ public:
*
* @param value The node's new content
*/
- virtual void setContent(gchar const *value)=0;
+ virtual void setContent(char const *value)=0;
//@{
/**
@@ -205,7 +204,7 @@ public:
* @param value The new value of the attribute
* @param is_interactive Ignored
*/
- virtual void setAttribute(gchar const *key, gchar const *value, bool is_interactive=false)=0;
+ virtual void setAttribute(char const *key, char const *value, bool is_interactive=false)=0;
void setAttribute(char const *key, Glib::ustring const &value, bool is_interactive=false)
{
@@ -399,7 +398,7 @@ public:
* @param src The node to merge into this node
* @param key The attribute to use as the identity attribute
*/
- virtual void mergeFrom(Node const *src, gchar const *key)=0;
+ virtual void mergeFrom(Node const *src, char const *key)=0;
/*@}*/
diff --git a/src/xml/pi-node.h b/src/xml/pi-node.h
index 1f892f97a..76a3dc741 100644
--- a/src/xml/pi-node.h
+++ b/src/xml/pi-node.h
@@ -14,7 +14,6 @@
#ifndef SEEN_INKSCAPE_XML_PI_NODE_H
#define SEEN_INKSCAPE_XML_PI_NODE_H
-#include <glib.h>
#include "xml/simple-node.h"
namespace Inkscape {
diff --git a/src/xml/quote.h b/src/xml/quote.h
index 8e3bca0eb..393bdf46e 100644
--- a/src/xml/quote.h
+++ b/src/xml/quote.h
@@ -1,7 +1,7 @@
#ifndef SEEN_XML_QUOTE_H
#define SEEN_XML_QUOTE_H
-#include <stddef.h>
+#include <cstddef>
size_t xml_quoted_strlen(char const *val);
char *xml_quote_strdup(char const *src);
diff --git a/src/xml/rebase-hrefs.h b/src/xml/rebase-hrefs.h
index 5baf96516..34afe6076 100644
--- a/src/xml/rebase-hrefs.h
+++ b/src/xml/rebase-hrefs.h
@@ -1,7 +1,6 @@
#ifndef REBASE_HREFS_H_SEEN
#define REBASE_HREFS_H_SEEN
-#include <glib.h>
#include "util/list.h"
#include "xml/attribute-record.h"
class SPDocument;
@@ -9,7 +8,7 @@ class SPDocument;
namespace Inkscape {
namespace XML {
-std::string calc_abs_doc_base(gchar const *doc_base);
+std::string calc_abs_doc_base(char const *doc_base);
/**
* Change relative hrefs in doc to be relative to \a new_base instead of doc.base.
@@ -18,7 +17,7 @@ std::string calc_abs_doc_base(gchar const *doc_base);
*
* @param spns True if doc should contain sodipodi:absref attributes.
*/
-void rebase_hrefs(SPDocument *doc, gchar const *new_base, bool spns);
+void rebase_hrefs(SPDocument *doc, char const *new_base, bool spns);
/**
* Change relative xlink:href attributes to be relative to \a new_abs_base instead of old_abs_base.
@@ -26,8 +25,8 @@ void rebase_hrefs(SPDocument *doc, gchar const *new_base, bool spns);
* Note that old_abs_base and new_abs_base must each be non-NULL, absolute directory paths.
*/
Inkscape::Util::List<AttributeRecord const> rebase_href_attrs(
- gchar const *old_abs_base,
- gchar const *new_abs_base,
+ char const *old_abs_base,
+ char const *new_abs_base,
Inkscape::Util::List<AttributeRecord const> attributes);
diff --git a/src/xml/repr.h b/src/xml/repr.h
index e691eaa7f..e1d7fdfd6 100644
--- a/src/xml/repr.h
+++ b/src/xml/repr.h
@@ -14,7 +14,6 @@
#ifndef SEEN_SP_REPR_H
#define SEEN_SP_REPR_H
-#include <glib.h>
#include <glibmm/quark.h>
#include "xml/node.h"
@@ -43,55 +42,55 @@ class Point;
}
/* SPXMLNs */
-char const *sp_xml_ns_uri_prefix(gchar const *uri, gchar const *suggested);
-char const *sp_xml_ns_prefix_uri(gchar const *prefix);
+char const *sp_xml_ns_uri_prefix(char const *uri, char const *suggested);
+char const *sp_xml_ns_prefix_uri(char const *prefix);
-Inkscape::XML::Document *sp_repr_document_new(gchar const *rootname);
+Inkscape::XML::Document *sp_repr_document_new(char const *rootname);
/* IO */
-Inkscape::XML::Document *sp_repr_read_file(gchar const *filename, gchar const *default_ns);
-Inkscape::XML::Document *sp_repr_read_mem(gchar const *buffer, int length, gchar const *default_ns);
+Inkscape::XML::Document *sp_repr_read_file(char const *filename, char const *default_ns);
+Inkscape::XML::Document *sp_repr_read_mem(char const *buffer, int length, char const *default_ns);
void sp_repr_write_stream(Inkscape::XML::Node *repr, Inkscape::IO::Writer &out,
- gint indent_level, bool add_whitespace, Glib::QueryQuark elide_prefix,
+ int indent_level, bool add_whitespace, Glib::QueryQuark elide_prefix,
int inlineattrs, int indent,
- gchar const *old_href_base = NULL,
- gchar const *new_href_base = NULL);
-Inkscape::XML::Document *sp_repr_read_buf (const Glib::ustring &buf, const gchar *default_ns);
+ char const *old_href_base = NULL,
+ char const *new_href_base = NULL);
+Inkscape::XML::Document *sp_repr_read_buf (const Glib::ustring &buf, const char *default_ns);
Glib::ustring sp_repr_save_buf(Inkscape::XML::Document *doc);
// TODO convert to std::string
void sp_repr_save_stream(Inkscape::XML::Document *doc, FILE *to_file,
- gchar const *default_ns = NULL, bool compress = false,
- gchar const *old_href_base = NULL,
- gchar const *new_href_base = NULL);
+ char const *default_ns = NULL, bool compress = false,
+ char const *old_href_base = NULL,
+ char const *new_href_base = NULL);
-bool sp_repr_save_file(Inkscape::XML::Document *doc, gchar const *filename, gchar const *default_ns=NULL);
-bool sp_repr_save_rebased_file(Inkscape::XML::Document *doc, gchar const *filename_utf8,
- gchar const *default_ns,
- gchar const *old_base, gchar const *new_base_filename);
+bool sp_repr_save_file(Inkscape::XML::Document *doc, char const *filename, char const *default_ns=NULL);
+bool sp_repr_save_rebased_file(Inkscape::XML::Document *doc, char const *filename_utf8,
+ char const *default_ns,
+ char const *old_base, char const *new_base_filename);
/* CSS stuff */
SPCSSAttr *sp_repr_css_attr_new(void);
void sp_repr_css_attr_unref(SPCSSAttr *css);
-SPCSSAttr *sp_repr_css_attr(Inkscape::XML::Node *repr, gchar const *attr);
+SPCSSAttr *sp_repr_css_attr(Inkscape::XML::Node *repr, char const *attr);
SPCSSAttr *sp_repr_css_attr_parse_color_to_fill(const Glib::ustring &text);
-SPCSSAttr *sp_repr_css_attr_inherited(Inkscape::XML::Node *repr, gchar const *attr);
+SPCSSAttr *sp_repr_css_attr_inherited(Inkscape::XML::Node *repr, char const *attr);
-gchar const *sp_repr_css_property(SPCSSAttr *css, gchar const *name, gchar const *defval);
-void sp_repr_css_set_property(SPCSSAttr *css, gchar const *name, gchar const *value);
-void sp_repr_css_unset_property(SPCSSAttr *css, gchar const *name);
-bool sp_repr_css_property_is_unset(SPCSSAttr *css, gchar const *name);
-double sp_repr_css_double_property(SPCSSAttr *css, gchar const *name, double defval);
+char const *sp_repr_css_property(SPCSSAttr *css, char const *name, char const *defval);
+void sp_repr_css_set_property(SPCSSAttr *css, char const *name, char const *value);
+void sp_repr_css_unset_property(SPCSSAttr *css, char const *name);
+bool sp_repr_css_property_is_unset(SPCSSAttr *css, char const *name);
+double sp_repr_css_double_property(SPCSSAttr *css, char const *name, double defval);
void sp_repr_css_write_string(SPCSSAttr *css, Glib::ustring &str);
-void sp_repr_css_set(Inkscape::XML::Node *repr, SPCSSAttr *css, gchar const *key);
+void sp_repr_css_set(Inkscape::XML::Node *repr, SPCSSAttr *css, char const *key);
void sp_repr_css_merge(SPCSSAttr *dst, SPCSSAttr *src);
-void sp_repr_css_attr_add_from_string(SPCSSAttr *css, const gchar *data);
-void sp_repr_css_change(Inkscape::XML::Node *repr, SPCSSAttr *css, gchar const *key);
-void sp_repr_css_change_recursive(Inkscape::XML::Node *repr, SPCSSAttr *css, gchar const *key);
+void sp_repr_css_attr_add_from_string(SPCSSAttr *css, const char *data);
+void sp_repr_css_change(Inkscape::XML::Node *repr, SPCSSAttr *css, char const *key);
+void sp_repr_css_change_recursive(Inkscape::XML::Node *repr, SPCSSAttr *css, char const *key);
void sp_repr_css_print(SPCSSAttr *css);
@@ -109,15 +108,15 @@ inline void sp_repr_unparent(Inkscape::XML::Node *repr) {
bool sp_repr_is_meta_element(const Inkscape::XML::Node *node);
/* Convenience */
-unsigned sp_repr_get_boolean(Inkscape::XML::Node *repr, gchar const *key, unsigned *val);
-unsigned sp_repr_get_int(Inkscape::XML::Node *repr, gchar const *key, int *val);
-unsigned sp_repr_get_double(Inkscape::XML::Node *repr, gchar const *key, double *val);
-unsigned sp_repr_set_boolean(Inkscape::XML::Node *repr, gchar const *key, unsigned val);
-unsigned sp_repr_set_int(Inkscape::XML::Node *repr, gchar const *key, int val);
-unsigned sp_repr_set_css_double(Inkscape::XML::Node *repr, gchar const *key, double val);
-unsigned sp_repr_set_svg_double(Inkscape::XML::Node *repr, gchar const *key, double val);
-unsigned sp_repr_set_point(Inkscape::XML::Node *repr, gchar const *key, Geom::Point const & val);
-unsigned sp_repr_get_point(Inkscape::XML::Node *repr, gchar const *key, Geom::Point *val);
+unsigned sp_repr_get_boolean(Inkscape::XML::Node *repr, char const *key, unsigned *val);
+unsigned sp_repr_get_int(Inkscape::XML::Node *repr, char const *key, int *val);
+unsigned sp_repr_get_double(Inkscape::XML::Node *repr, char const *key, double *val);
+unsigned sp_repr_set_boolean(Inkscape::XML::Node *repr, char const *key, unsigned val);
+unsigned sp_repr_set_int(Inkscape::XML::Node *repr, char const *key, int val);
+unsigned sp_repr_set_css_double(Inkscape::XML::Node *repr, char const *key, double val);
+unsigned sp_repr_set_svg_double(Inkscape::XML::Node *repr, char const *key, double val);
+unsigned sp_repr_set_point(Inkscape::XML::Node *repr, char const *key, Geom::Point const & val);
+unsigned sp_repr_get_point(Inkscape::XML::Node *repr, char const *key, Geom::Point *val);
int sp_repr_compare_position(Inkscape::XML::Node const *first, Inkscape::XML::Node const *second);
@@ -135,16 +134,16 @@ int sp_repr_compare_position(Inkscape::XML::Node const *first, Inkscape::XML::No
* @relatesalso Inkscape::XML::Node
*/
Inkscape::XML::Node *sp_repr_lookup_name(Inkscape::XML::Node *repr,
- gchar const *name,
- gint maxdepth = -1);
+ char const *name,
+ int maxdepth = -1);
Inkscape::XML::Node const *sp_repr_lookup_name(Inkscape::XML::Node const *repr,
- gchar const *name,
- gint maxdepth = -1);
+ char const *name,
+ int maxdepth = -1);
Inkscape::XML::Node *sp_repr_lookup_child(Inkscape::XML::Node *repr,
- gchar const *key,
- gchar const *value);
+ char const *key,
+ char const *value);
inline Inkscape::XML::Node *sp_repr_document_first_child(Inkscape::XML::Document const *doc) {
diff --git a/src/xml/simple-node.h b/src/xml/simple-node.h
index 7c5eb8fbd..1fcb9193b 100644
--- a/src/xml/simple-node.h
+++ b/src/xml/simple-node.h
@@ -18,7 +18,7 @@
#ifndef SEEN_INKSCAPE_XML_SIMPLE_NODE_H
#define SEEN_INKSCAPE_XML_SIMPLE_NODE_H
-#include <glib.h> // g_assert()
+#include <cassert>
#include "xml/node.h"
#include "xml/attribute-record.h"
@@ -38,7 +38,7 @@ class SimpleNode
: virtual public Node, public Inkscape::GC::Managed<>
{
public:
- gchar const *name() const;
+ char const *name() const;
int code() const { return _name; }
void setCodeUnsafe(int code) {
_name = code;
@@ -83,14 +83,14 @@ public:
unsigned position() const;
void setPosition(int pos);
- gchar const *attribute(gchar const *key) const;
- void setAttribute(gchar const *key, gchar const *value, bool is_interactive=false);
- bool matchAttributeName(gchar const *partial_name) const;
+ char const *attribute(char const *key) const;
+ void setAttribute(char const *key, char const *value, bool is_interactive=false);
+ bool matchAttributeName(char const *partial_name) const;
- gchar const *content() const;
- void setContent(gchar const *value);
+ char const *content() const;
+ void setContent(char const *value);
- void mergeFrom(Node const *src, gchar const *key);
+ void mergeFrom(Node const *src, char const *key);
Inkscape::Util::List<AttributeRecord const> attributeList() const {
return _attributes;
@@ -100,7 +100,7 @@ public:
void synthesizeEvents(NodeObserver &observer);
void addListener(NodeEventVector const *vector, void *data) {
- g_assert(vector != NULL);
+ assert(vector != NULL);
_observers.addListener(*vector, data);
}
void addObserver(NodeObserver &observer) {