diff options
| author | Liam P. White <inkscapebronyat-signgmaildotcom> | 2014-03-06 02:08:09 +0000 |
|---|---|---|
| committer | Liam P. White <inkscapebronyat-signgmaildotcom> | 2014-03-06 02:08:09 +0000 |
| commit | 50a5b62b327c55b8038b5031d35bf6ae48705485 (patch) | |
| tree | 3039059daa54626f65d70a7cbe50937f31558653 | |
| parent | Makefile fix (diff) | |
| download | inkscape-50a5b62b327c55b8038b5031d35bf6ae48705485.tar.gz inkscape-50a5b62b327c55b8038b5031d35bf6ae48705485.zip | |
Fixed size of swatches widget
(bzr r13090.1.19)
| -rw-r--r-- | live_effects.patch | 2008 | ||||
| -rw-r--r-- | mkerror.txt | 11 | ||||
| -rw-r--r-- | objects_dialog.patch | 3637 | ||||
| -rw-r--r-- | share/palettes/MLP/Makefile | 524 | ||||
| -rw-r--r-- | src/ui/dialog/swatches.cpp | 2 |
5 files changed, 1 insertions, 6181 deletions
diff --git a/live_effects.patch b/live_effects.patch deleted file mode 100644 index 3d1091221..000000000 --- a/live_effects.patch +++ /dev/null @@ -1,2008 +0,0 @@ -=== modified file 'src/live_effects/CMakeLists.txt' ---- src/live_effects/CMakeLists.txt 2012-03-23 21:02:03 +0000 -+++ src/live_effects/CMakeLists.txt 2014-03-01 16:12:14 +0000 -@@ -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,11 @@ - 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-gears.cpp - lpe-interpolate.cpp - lpe-knot.cpp -@@ -47,11 +52,13 @@ - 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/unit.cpp - parameter/vector.cpp - -@@ -61,8 +68,10 @@ - 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 +79,11 @@ - 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-gears.h - lpe-interpolate.h - lpe-knot.h -@@ -109,6 +121,7 @@ - parameter/path-reference.h - parameter/path.h - parameter/originalpath.h -+ parameter/originalpatharray.h - parameter/point.h - parameter/powerstrokepointarray.h - parameter/random.h - -=== modified file 'src/live_effects/Makefile_insert' ---- src/live_effects/Makefile_insert 2012-03-23 21:02:03 +0000 -+++ src/live_effects/Makefile_insert 2014-03-01 18:49:52 +0000 -@@ -82,4 +82,14 @@ - 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-stroke.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 - -=== modified file 'src/live_effects/effect-enum.h' ---- src/live_effects/effect-enum.h 2012-01-12 21:06:16 +0000 -+++ src/live_effects/effect-enum.h 2014-03-01 02:07:48 +0000 -@@ -50,6 +50,11 @@ - EXTRUDE, - POWERSTROKE, - CLONE_ORIGINAL, -+ ATTACH_PATH, -+ FILL_BETWEEN_STROKES, -+ FILL_BETWEEN_MANY, -+ ELLIPSE_5PTS, -+ BOUNDING_BOX, - 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) - }; - - -=== modified file 'src/live_effects/effect.cpp' ---- src/live_effects/effect.cpp 2014-01-12 22:12:14 +0000 -+++ src/live_effects/effect.cpp 2014-03-01 02:27:38 +0000 -@@ -5,7 +5,7 @@ - * Released under GNU GPL, read the file 'COPYING' for more information - */ - --//#define LPE_ENABLE_TEST_EFFECTS -+#define LPE_ENABLE_TEST_EFFECTS - - #ifdef HAVE_CONFIG_H - # include "config.h" -@@ -47,6 +47,11 @@ - #include "live_effects/lpe-extrude.h" - #include "live_effects/lpe-powerstroke.h" - #include "live_effects/lpe-clone-original.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 "xml/node-event-vector.h" - #include "sp-object.h" -@@ -122,6 +127,12 @@ - /* 0.49 */ - {POWERSTROKE, N_("Power stroke"), "powerstroke"}, - {CLONE_ORIGINAL, N_("Clone original path"), "clone_original"}, -+/* 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"}, - }; - const Util::EnumDataConverter<EffectType> LPETypeConverter(LPETypeData, sizeof(LPETypeData)/sizeof(*LPETypeData)); - -@@ -245,6 +256,21 @@ - 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; - default: - g_warning("LivePathEffect::Effect::New called with invalid patheffect type (%d)", lpenr); - neweffect = NULL; - -=== added file 'src/live_effects/lpe-attach-path.cpp' ---- src/live_effects/lpe-attach-path.cpp 1970-01-01 00:00:00 +0000 -+++ src/live_effects/lpe-attach-path.cpp 2014-03-01 22:47:28 +0000 -@@ -0,0 +1,203 @@ -+/* -+ * Copyright (C) Johan Engelen 2012 <j.b.c.engelen@alumnus.utwente.nl> -+ * -+ * 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( dynamic_cast<Parameter *>(&start_path) ); -+ registerParameter( dynamic_cast<Parameter *>(&start_path_position) ); -+ registerParameter( dynamic_cast<Parameter *>(&start_path_curve_start) ); -+ registerParameter( dynamic_cast<Parameter *>(&start_path_curve_end) ); -+ -+ registerParameter( dynamic_cast<Parameter *>(&end_path) ); -+ registerParameter( dynamic_cast<Parameter *>(&end_path_position) ); -+ registerParameter( dynamic_cast<Parameter *>(&end_path_curve_start) ); -+ registerParameter( dynamic_cast<Parameter *>(&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::doBeforeEffect(const SPLPEItem *lpeitem) -+{ -+ lpe_effect = lpeitem; -+} -+ -+void LPEAttachPath::doEffect (SPCurve * curve) -+{ -+ std::vector<Geom::Path> this_pathv = curve->get_pathvector(); -+ if (lpe_effect && !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(lpe_effect); -+ -+ 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(lpe_effect); -+ -+ 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 : - -=== added file 'src/live_effects/lpe-attach-path.h' ---- src/live_effects/lpe-attach-path.h 1970-01-01 00:00:00 +0000 -+++ src/live_effects/lpe-attach-path.h 2014-03-01 22:40:18 +0000 -@@ -0,0 +1,54 @@ -+#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 doBeforeEffect(const SPLPEItem *lpeitem); -+ 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; -+ const SPLPEItem * lpe_effect; -+}; -+ -+}; //namespace LivePathEffect -+}; //namespace Inkscape -+ -+#endif - -=== added file 'src/live_effects/lpe-bounding-box.cpp' ---- src/live_effects/lpe-bounding-box.cpp 1970-01-01 00:00:00 +0000 -+++ src/live_effects/lpe-bounding-box.cpp 2014-03-01 21:18:13 +0000 -@@ -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 : - -=== added file 'src/live_effects/lpe-bounding-box.h' ---- src/live_effects/lpe-bounding-box.h 1970-01-01 00:00:00 +0000 -+++ src/live_effects/lpe-bounding-box.h 2014-03-01 19:37:36 +0000 -@@ -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 - -=== added file 'src/live_effects/lpe-ellipse_5pts.cpp' ---- src/live_effects/lpe-ellipse_5pts.cpp 1970-01-01 00:00:00 +0000 -+++ src/live_effects/lpe-ellipse_5pts.cpp 2013-09-07 18:46:36 +0000 -@@ -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/svg-path.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 : - -=== added file 'src/live_effects/lpe-ellipse_5pts.h' ---- src/live_effects/lpe-ellipse_5pts.h 1970-01-01 00:00:00 +0000 -+++ src/live_effects/lpe-ellipse_5pts.h 2013-09-07 18:46:36 +0000 -@@ -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 : - -=== added file 'src/live_effects/lpe-fill-between-many.cpp' ---- src/live_effects/lpe-fill-between-many.cpp 1970-01-01 00:00:00 +0000 -+++ src/live_effects/lpe-fill-between-many.cpp 2014-03-01 21:14:38 +0000 -@@ -0,0 +1,77 @@ -+/* -+ * Copyright (C) Theodore Janeczko 2012 <flutterguy317@gmail.com> -+ * -+ * Released under GNU GPL, read the file 'COPYING' for more information -+ */ -+ -+#include <glibmm/i18n.h> -+#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" -+ -+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 : - -=== added file 'src/live_effects/lpe-fill-between-many.h' ---- src/live_effects/lpe-fill-between-many.h 1970-01-01 00:00:00 +0000 -+++ src/live_effects/lpe-fill-between-many.h 2014-03-01 21:13:34 +0000 -@@ -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 - -=== added file 'src/live_effects/lpe-fill-between-strokes.cpp' ---- src/live_effects/lpe-fill-between-strokes.cpp 1970-01-01 00:00:00 +0000 -+++ src/live_effects/lpe-fill-between-strokes.cpp 2014-03-01 21:13:06 +0000 -@@ -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 : - -=== added file 'src/live_effects/lpe-fill-between-strokes.h' ---- src/live_effects/lpe-fill-between-strokes.h 1970-01-01 00:00:00 +0000 -+++ src/live_effects/lpe-fill-between-strokes.h 2014-03-01 21:11:40 +0000 -@@ -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 - -=== added file 'src/live_effects/parameter/originalpatharray.cpp' ---- src/live_effects/parameter/originalpatharray.cpp 1970-01-01 00:00:00 +0000 -+++ src/live_effects/parameter/originalpatharray.cpp 2013-09-07 18:46:36 +0000 -@@ -0,0 +1,486 @@ -+/* -+ * Copyright (C) Johan Engelen 2008 <j.b.c.engelen@utwente.nl> -+ * -+ * Released under GNU GPL, read the file 'COPYING' for more information -+ */ -+ -+#include "live_effects/parameter/originalpatharray.h" -+ -+#include <gtkmm/widget.h> -+#include <gtkmm/icontheme.h> -+#include <gtkmm/imagemenuitem.h> -+#include <gtkmm/separatormenuitem.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 <glibmm/i18n.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); -+ -+ _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::linked_transformed(Geom::Affine const *mp, SPItem* original, PathAndDirection* 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)->getCurvePerceived(); -+ } -+ 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)); -+} -+ -+//void PathParam::linked_transformed(Geom::Affine const *rel_transf, SPItem *moved_item) -+//{ -+// linked_transformed_callback(rel_transf, moved_item); -+//} -+ -+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 : - -=== added file 'src/live_effects/parameter/originalpatharray.h' ---- src/live_effects/parameter/originalpatharray.h 1970-01-01 00:00:00 +0000 -+++ src/live_effects/parameter/originalpatharray.h 2013-09-07 18:46:36 +0000 -@@ -0,0 +1,123 @@ -+#ifndef INKSCAPE_LIVEPATHEFFECT_PARAMETER_ORIGINALPATHARRAY_H -+#define INKSCAPE_LIVEPATHEFFECT_PARAMETER_ORIGINALPATHARRAY_H -+ -+/* -+ * Inkscape::LivePathEffectParameters -+ * -+* Copyright (C) Johan Engelen 2008 <j.b.c.engelen@utwente.nl> -+ * -+ * 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; -+ //SPItem *obj; -+ 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 *mp, SPItem *original, PathAndDirection* to); -+ 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 : - -=== added file 'src/live_effects/parameter/transformedpoint.cpp' ---- src/live_effects/parameter/transformedpoint.cpp 1970-01-01 00:00:00 +0000 -+++ src/live_effects/parameter/transformedpoint.cpp 2013-09-07 18:46:36 +0000 -@@ -0,0 +1,182 @@ -+/* -+ * Copyright (C) Theodore Janeczko 2012 <flutterguy317@gmail.com> -+ * -+ * Released under GNU GPL, read the file 'COPYING' for more information -+ */ -+ -+#include <glibmm/i18n.h> -+ -+#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" -+ -+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 : - -=== added file 'src/live_effects/parameter/transformedpoint.h' ---- src/live_effects/parameter/transformedpoint.h 1970-01-01 00:00:00 +0000 -+++ src/live_effects/parameter/transformedpoint.h 2013-09-07 18:46:36 +0000 -@@ -0,0 +1,87 @@ -+#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_origin_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; -+// SPKnotShapeType ori_knot_shape; -+// SPKnotModeType ori_knot_mode; -+// guint32 ori_knot_color; -+ -+// friend class VectorParamKnotHolderEntity_Origin; -+ friend class TransformedPointParamKnotHolderEntity_Vector; -+}; -+ -+ -+} //namespace LivePathEffect -+ -+} //namespace Inkscape -+ -+#endif - diff --git a/mkerror.txt b/mkerror.txt deleted file mode 100644 index 069535166..000000000 --- a/mkerror.txt +++ /dev/null @@ -1,11 +0,0 @@ -make all-recursive -make[1]: Entering directory `/home/inkscape-diff' -Making all in src -make[2]: Entering directory `/home/inkscape-diff/src' -make all-am -make[3]: Entering directory `/home/inkscape-diff/src' - CXXLD inkscape - CXXLD inkview -make[3]: Leaving directory `/home/inkscape-diff/src' -make[2]: Leaving directory `/home/inkscape-diff/src' -make[1]: Leaving directory `/home/inkscape-diff' diff --git a/objects_dialog.patch b/objects_dialog.patch deleted file mode 100644 index 1cdd09c34..000000000 --- a/objects_dialog.patch +++ /dev/null @@ -1,3637 +0,0 @@ -=== modified file 'src/attributes.cpp' ---- src/attributes.cpp 2012-12-22 16:34:31 +0000 -+++ src/attributes.cpp 2013-03-17 14:36:44 +0000 -@@ -41,6 +41,7 @@ - {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"}, -@@ -50,7 +51,9 @@ - {SP_ATTR_XLINK_SHOW, "xlink:show"}, - {SP_ATTR_XLINK_ACTUATE, "xlink:actuate"}, - {SP_ATTR_TARGET, "target"}, -+ /* SPGroup */ - {SP_ATTR_INKSCAPE_GROUPMODE, "inkscape:groupmode"}, -+ {SP_ATTR_INKSCAPE_EXPANDED, "inkscape:expanded"}, - /* SPRoot */ - {SP_ATTR_VERSION, "version"}, - {SP_ATTR_WIDTH, "width"}, - -=== modified file 'src/attributes.h' ---- src/attributes.h 2012-12-22 16:34:31 +0000 -+++ src/attributes.h 2013-03-17 14:36:17 +0000 -@@ -40,6 +40,7 @@ - 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 @@ - SP_ATTR_TARGET, - /* SPGroup */ - SP_ATTR_INKSCAPE_GROUPMODE, -+ SP_ATTR_INKSCAPE_EXPANDED, - /* SPRoot */ - SP_ATTR_VERSION, - SP_ATTR_WIDTH, - -=== modified file 'src/desktop.cpp' ---- src/desktop.cpp 2013-01-27 14:19:11 +0000 -+++ src/desktop.cpp 2013-03-17 14:43:46 +0000 -@@ -1885,6 +1885,7 @@ - std::map<int, Glib::ustring> mapVerbPreference; - std::map<int, Glib::ustring>::const_iterator iter; - mapVerbPreference.insert(std::make_pair ((int)SP_VERB_DIALOG_LAYERS, "/dialogs/layers") ); -+ mapVerbPreference.insert(std::make_pair ((int)SP_VERB_DIALOG_OBJECTS, "/dialogs/objects") ); - mapVerbPreference.insert(std::make_pair ((int)SP_VERB_DIALOG_FILL_STROKE, "/dialogs/fillstroke") ); - mapVerbPreference.insert(std::make_pair ((int)SP_VERB_DIALOG_EXTENSIONEDITOR, "/dialogs/extensioneditor") ); - mapVerbPreference.insert(std::make_pair ((int)SP_VERB_DIALOG_ALIGN_DISTRIBUTE, "/dialogs/align") ); - -=== modified file 'src/menus-skeleton.h' ---- src/menus-skeleton.h 2013-03-16 16:26:03 +0000 -+++ src/menus-skeleton.h 2013-03-17 14:30:19 +0000 -@@ -180,6 +180,8 @@ - " <verb verb-id=\"DialogLayers\" />\n" - " </submenu>\n" - " <submenu name=\"" N_("_Object") "\">\n" -+" <verb verb-id=\"DialogObjects\" />\n" -+" <separator/>\n" - " <verb verb-id=\"DialogFillStroke\" />\n" - " <verb verb-id=\"DialogObjectProperties\" />\n" - " <verb verb-id=\"DialogSymbols\" />\n" - -=== modified file 'src/sp-item-group.cpp' ---- src/sp-item-group.cpp 2013-01-24 11:43:26 +0000 -+++ src/sp-item-group.cpp 2013-03-17 14:50:17 +0000 -@@ -123,6 +123,7 @@ - static void sp_group_build(SPObject *object, SPDocument *document, Inkscape::XML::Node *repr) - { - object->readAttr( "inkscape:groupmode" ); -+ object->readAttr( "inkscape:expanded" ); - - if (((SPObjectClass *)sp_group_parent_class)->build) { - ((SPObjectClass *)sp_group_parent_class)->build(object, document, repr); -@@ -221,7 +222,7 @@ - Inkscape::GC::release((Inkscape::XML::Node *) l->data); - l = g_slist_remove (l, l->data); - } -- } else { -+ } else if (!(flags & SP_OBJECT_WRITE_NO_CHILDREN)) { - for (SPObject *child = object->firstChild() ; child ; child = child->getNext() ) { - if ( !SP_IS_TITLE(child) && !SP_IS_DESC(child) ) { - child->updateRepr(flags); -@@ -241,6 +242,12 @@ - value = NULL; - } - repr->setAttribute("inkscape:groupmode", value); -+ -+ if (group->_expanded) { -+ repr->setAttribute("inkscape:expanded", "true"); -+ } else { -+ repr->setAttribute("inkscape:expanded", NULL); -+ } - } - - if (((SPObjectClass *) (sp_group_parent_class))->write) { -@@ -280,6 +287,11 @@ - group->setLayerMode(SPGroup::GROUP); - } - break; -+ case SP_ATTR_INKSCAPE_EXPANDED: -+ if ( value && !strcmp(value, "true") ) { -+ group->setExpanded(true); -+ } -+ break; - default: { - if (((SPObjectClass *) (sp_group_parent_class))->set) { - (* ((SPObjectClass *) (sp_group_parent_class))->set)(object, key, value); -@@ -517,6 +529,12 @@ - } - } - -+void SPGroup::setExpanded(bool isexpanded) { -+ if ( _expanded != isexpanded ){ -+ _expanded = isexpanded; -+ } -+} -+ - SPGroup::LayerMode SPGroup::layerDisplayMode(unsigned int dkey) const { - std::map<unsigned int, LayerMode>::const_iterator iter; - iter = _display_modes.find(dkey); - -=== modified file 'src/sp-item-group.h' ---- src/sp-item-group.h 2011-10-04 19:04:58 +0000 -+++ src/sp-item-group.h 2013-03-17 14:50:53 +0000 -@@ -36,11 +36,15 @@ - struct SPGroup : public SPLPEItem { - enum LayerMode { GROUP, LAYER, MASK_HELPER }; - -+ bool _expanded; - 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); - - LayerMode effectiveLayerMode(unsigned int display_key) const { - if ( _layer_mode == LAYER ) { - -=== modified file 'src/sp-item.cpp' ---- src/sp-item.cpp 2013-01-23 12:22:14 +0000 -+++ src/sp-item.cpp 2013-03-17 14:54:59 +0000 -@@ -72,6 +72,9 @@ - #include "live_effects/lpeobject.h" - #include "live_effects/effect.h" - #include "live_effects/lpeobject-reference.h" -+#include "ui/tool/node-tool.h" -+#include "ui/tool/multi-path-manipulator.h" -+#include "tools-switch.h" - - #define noSP_ITEM_DEBUG_IDLE - -@@ -135,6 +138,8 @@ - _is_evaluated = true; - _evaluated_status = StatusUnknown; - -+ _highlightColor = NULL; -+ - transform = Geom::identity(); - doc_bbox = Geom::OptRect(); - freeze_stroke_width = false; -@@ -210,6 +215,62 @@ - return true; - } - -+bool SPItem::isHighlightSet() const { -+ return _highlightColor != NULL; -+} -+ -+guint32 SPItem::highlight_color() const { -+ if (_highlightColor) -+ { -+ return atoi(_highlightColor) | 0x000000ff; -+ } -+ 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) | 0x000000ff; -+ } -+} -+ -+void SPItem::setHighlightColor(guint32 const color) -+{ -+ g_free(_highlightColor); -+ if (color & 0x000000ff) -+ { -+ _highlightColor = g_strdup_printf("%u", color); -+ } -+ else -+ { -+ _highlightColor = NULL; -+ } -+ -+ InkNodeTool *tool = 0; -+ if (SP_ACTIVE_DESKTOP ) { -+ SPEventContext *ec = SP_ACTIVE_DESKTOP->event_context; -+ if (INK_IS_NODE_TOOL(ec)) { -+ tool = static_cast<InkNodeTool*>(ec); -+ tools_switch(tool->desktop, TOOLS_NODES); -+ } -+ } -+} -+ -+void SPItem::unsetHighlightColor() -+{ -+ g_free(_highlightColor); -+ _highlightColor = NULL; -+ InkNodeTool *tool = 0; -+ if (SP_ACTIVE_DESKTOP ) { -+ SPEventContext *ec = SP_ACTIVE_DESKTOP->event_context; -+ if (INK_IS_NODE_TOOL(ec)) { -+ tool = static_cast<InkNodeTool*>(ec); -+ tools_switch(tool->desktop, TOOLS_NODES); -+ } -+ } -+} -+ - void SPItem::setEvaluated(bool evaluated) { - _is_evaluated = evaluated; - _evaluated_status = StatusSet; -@@ -387,14 +448,30 @@ - while (target_ref->parent() != target_ref->root()) { - target_ref = target_ref->parent(); - } -+ if (target_ref) { -+ SPObject *obj = document->getObjectByRepr(target_ref); -+ if (SP_IS_ITEM(obj)) { -+ target = SP_ITEM(obj); -+ } -+ } - first = TRUE; - } -+ -+ g_assert(target_ref != NULL); - - if (intoafter) { -+ Geom::Affine t = getRelativeTransform(target); -+ doWriteTransform(our_ref, t); -+ our_ref = getRepr(); -+ - // 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()) { -+ Geom::Affine t = getRelativeTransform(target->parent); -+ doWriteTransform(our_ref, t); -+ our_ref = getRepr(); -+ - // Change in parent, need to remove and add - our_ref->parent()->removeChild(our_ref); - target_ref->parent()->addChild(our_ref, target_ref); -@@ -424,6 +501,7 @@ - object->readAttr( "inkscape:transform-center-y" ); - object->readAttr( "inkscape:connector-avoid" ); - object->readAttr( "inkscape:connection-points" ); -+ object->readAttr( "inkscape:highlight-color" ); - - if ((SP_OBJECT_CLASS(sp_item_parent_class))->build) { - (* (SP_OBJECT_CLASS(sp_item_parent_class))->build)(object, document, repr); -@@ -510,6 +588,14 @@ - 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; -@@ -720,6 +806,11 @@ - g_free ((void *) value); - } - } -+ if (item->_highlightColor){ -+ repr->setAttribute("inkscape:highlight-color", item->_highlightColor); -+ } else { -+ repr->setAttribute("inkscape:highlight-color", NULL); -+ } - - if ((SP_OBJECT_CLASS(sp_item_parent_class))->write) { - (SP_OBJECT_CLASS(sp_item_parent_class))->write(object, xml_doc, repr, flags); - -=== modified file 'src/sp-item.h' ---- src/sp-item.h 2013-03-14 23:24:17 +0000 -+++ src/sp-item.h 2013-03-17 14:51:37 +0000 -@@ -144,11 +144,21 @@ - - void init(); - bool isLocked() const; -+ bool isSensitive() const { -+ return sensitive; -+ }; - void setLocked(bool lock); - - bool isHidden() const; - void setHidden(bool hidden); - -+ bool isHighlightSet() const; -+ guint32 highlight_color() const; -+ -+ void setHighlightColor(guint32 color); -+ -+ void unsetHighlightColor(); -+ - bool isEvaluated() const; - void setEvaluated(bool visible); - void resetEvaluated(); -@@ -218,6 +228,7 @@ - Geom::Affine dt2i_affine() const; - void convert_to_guides(); - -+ gchar *_highlightColor; - private: - enum EvaluatedStatus - { - -=== modified file 'src/sp-object.h' ---- src/sp-object.h 2013-03-14 01:33:10 +0000 -+++ src/sp-object.h 2013-03-17 14:53:10 +0000 -@@ -48,6 +48,7 @@ - #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 <stddef.h> - -=== modified file 'src/ui/dialog/Makefile_insert' ---- src/ui/dialog/Makefile_insert 2012-10-11 17:54:14 +0000 -+++ src/ui/dialog/Makefile_insert 2013-03-17 13:55:34 +0000 -@@ -70,6 +70,8 @@ - ui/dialog/memory.h \ - ui/dialog/messages.cpp \ - ui/dialog/messages.h \ -+ ui/dialog/objects.cpp \ -+ ui/dialog/objects.h \ - ui/dialog/ocaldialogs.cpp \ - ui/dialog/ocaldialogs.h \ - ui/dialog/object-attributes.cpp \ - -=== modified file 'src/ui/dialog/dialog-manager.cpp' ---- src/ui/dialog/dialog-manager.cpp 2013-03-16 16:26:03 +0000 -+++ src/ui/dialog/dialog-manager.cpp 2013-03-17 14:03:02 +0000 -@@ -40,6 +40,7 @@ - #include "ui/dialog/undo-history.h" - #include "ui/dialog/panel-dialog.h" - #include "ui/dialog/layers.h" -+#include "ui/dialog/objects.h" - #include "ui/dialog/icon-preview.h" - #include "ui/dialog/floating-behavior.h" - #include "ui/dialog/dock-behavior.h" -@@ -108,6 +109,7 @@ - registerFactory("IconPreviewPanel", &create<IconPreviewPanel, FloatingBehavior>); - registerFactory("InkscapePreferences", &create<InkscapePreferences, FloatingBehavior>); - registerFactory("LayersPanel", &create<LayersPanel, FloatingBehavior>); -+ registerFactory("ObjectsPanel", &create<ObjectsPanel, FloatingBehavior>); - registerFactory("LivePathEffect", &create<LivePathEffectEditor, FloatingBehavior>); - registerFactory("Memory", &create<Memory, FloatingBehavior>); - registerFactory("Messages", &create<Messages, FloatingBehavior>); -@@ -142,6 +144,7 @@ - registerFactory("IconPreviewPanel", &create<IconPreviewPanel, DockBehavior>); - registerFactory("InkscapePreferences", &create<InkscapePreferences, DockBehavior>); - registerFactory("LayersPanel", &create<LayersPanel, DockBehavior>); -+ registerFactory("ObjectsPanel", &create<ObjectsPanel, DockBehavior>); - registerFactory("LivePathEffect", &create<LivePathEffectEditor, DockBehavior>); - registerFactory("Memory", &create<Memory, DockBehavior>); - registerFactory("Messages", &create<Messages, DockBehavior>); - -=== added file 'src/ui/dialog/objects.cpp' ---- src/ui/dialog/objects.cpp 1970-01-01 00:00:00 +0000 -+++ src/ui/dialog/objects.cpp 2013-03-17 15:01:22 +0000 -@@ -0,0 +1,2014 @@ -+/* -+ * A simple panel for objects -+ * -+ * 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 -+ -+#include "objects.h" -+#include <gtkmm/widget.h> -+#include <gtkmm/icontheme.h> -+#include <gtkmm/imagemenuitem.h> -+#include <gtkmm/separatormenuitem.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 "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/imagetoggler.h" -+#include "ui/widget/layertypeicon.h" -+#include "ui/widget/clipmaskicon.h" -+#include "ui/widget/highlight-picker.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 "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 "layer-manager.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_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_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); -+ } -+ 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; -+}; -+ -+/** -+ * 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; -+ row[_model->_colLabel] = item->label() ? item->label() : item->getId(); -+ 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); -+ -+ //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 -+ _store->foreach_iter( sigc::bind<SPObject*>(sigc::mem_fun(*this, &ObjectsPanel::_checkForUpdated), obj) ); -+ 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; -+ -+ 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 -+ _opacity_adjustment.set_value((item->style->opacity.set ? SP_SCALE24_TO_FLOAT(item->style->opacity.value) : 1) * _opacity_adjustment.get_upper()); -+ 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) -+{ -+ -+ switch (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_Home: -+ { -+ //Move item(s) to top of containing group/layer -+ if (_desktop->selection->isEmpty()) -+ { -+ _fireAction( SP_VERB_LAYER_TO_TOP ); -+ } -+ else -+ { -+ _fireAction( SP_VERB_SELECTION_TO_FRONT ); -+ } -+ return true; -+ } -+ case GDK_End: -+ { -+ //Move item(s) to bottom of containing group/layer -+ if (_desktop->selection->isEmpty()) -+ { -+ _fireAction( SP_VERB_LAYER_TO_BOTTOM ); -+ } -+ else -+ { -+ _fireAction( SP_VERB_SELECTION_TO_BACK ); -+ } -+ return true; -+ } -+ case GDK_KEY_Page_Up: -+ { -+ //Move item(s) up in containing group/layer -+ if (_desktop->selection->isEmpty()) -+ { -+ _fireAction( SP_VERB_LAYER_RAISE ); -+ } -+ else -+ { -+ if (event->state & GDK_SHIFT_MASK) { -+ _fireAction( SP_VERB_LAYER_MOVE_TO_NEXT ); -+ } else { -+ _fireAction( SP_VERB_SELECTION_RAISE ); -+ } -+ } -+ return true; -+ } -+ case GDK_KEY_Page_Down: -+ { -+ //Move item(s) down in containing group/layer -+ if (_desktop->selection->isEmpty()) -+ { -+ _fireAction( SP_VERB_LAYER_LOWER ); -+ } -+ else -+ { -+ if (event->state & GDK_SHIFT_MASK) { -+ _fireAction( SP_VERB_LAYER_MOVE_TO_PREV ); -+ } else { -+ _fireAction( SP_VERB_SELECTION_LOWER ); -+ } -+ } -+ return true; -+ } -+ //TODO: Handle Ctrl-A, etc. -+ } -+ return false; -+} -+ -+/** -+ * 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_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_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_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::done(SP_ACTIVE_DOCUMENT, 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; -+ item->style->opacity.value = SP_SCALE24_FROM_FLOAT(_opacity_adjustment.get_value() / _opacity_adjustment.get_upper()); -+ 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 ); -+ } -+ -+ //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, &ObjectCompositeSettings::_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 -+ Gtk::Button* btn = Gtk::manage( new Gtk::Button() ); -+ _styleButton( *btn, GTK_STOCK_ADD, _("New Layer") ); -+ btn->signal_clicked().connect( sigc::bind( sigc::mem_fun(*this, &ObjectsPanel::_takeAction), (int)BUTTON_NEW) ); -+ _buttonsSecondary.pack_start(*btn, Gtk::PACK_SHRINK); -+ -+ btn = Gtk::manage( new Gtk::Button() ); -+ _styleButton( *btn, GTK_STOCK_REMOVE, _("Remove") ); -+ 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); -+ -+ btn = Gtk::manage( new Gtk::Button() ); -+ _styleButton( *btn, GTK_STOCK_GOTO_BOTTOM, _("Move To Bottom") ); -+ 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); -+ -+ btn = Gtk::manage( new Gtk::Button() ); -+ _styleButton( *btn, GTK_STOCK_GO_DOWN, _("Move Down") ); -+ 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); -+ -+ btn = Gtk::manage( new Gtk::Button() ); -+ _styleButton( *btn, GTK_STOCK_GO_UP, _("Move Up") ); -+ 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); -+ -+ btn = Gtk::manage( new Gtk::Button() ); -+ _styleButton( *btn, GTK_STOCK_GOTO_TOP, _("Move To Top") ); -+ 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); -+ -+ btn = Gtk::manage( new Gtk::Button() ); -+ _styleButton( *btn, GTK_STOCK_UNINDENT, _("Collapse All") ); -+ 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_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 -+ -+ -+/* -+ 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 : - -=== added file 'src/ui/dialog/objects.h' ---- src/ui/dialog/objects.h 1970-01-01 00:00:00 +0000 -+++ src/ui/dialog/objects.h 2013-03-17 13:42:01 +0000 -@@ -0,0 +1,255 @@ -+/* -+ * 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 -+ -+#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 : - -=== modified file 'src/ui/tool/multi-path-manipulator.cpp' ---- src/ui/tool/multi-path-manipulator.cpp 2012-09-06 02:25:16 +0000 -+++ src/ui/tool/multi-path-manipulator.cpp 2013-03-19 00:31:09 +0000 -@@ -195,7 +195,7 @@ - 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); -@@ -834,7 +834,7 @@ - } - - /** 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) { -@@ -846,7 +846,7 @@ - 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(); - } - } - - -=== modified file 'src/ui/tool/multi-path-manipulator.h' ---- src/ui/tool/multi-path-manipulator.h 2012-05-17 09:10:15 +0000 -+++ src/ui/tool/multi-path-manipulator.h 2013-03-19 00:31:16 +0000 -@@ -106,7 +106,7 @@ - void _commit(CommitEvent cps); - void _done(gchar const *reason, bool alert_LPE = false); - void _doneWithCleanup(gchar const *reason, bool alert_LPE = false); -- guint32 _getOutlineColor(ShapeRole role); -+ guint32 _getOutlineColor(ShapeRole role, SPItem *item); - - MapType _mmap; - public: - -=== modified file 'src/ui/tool/node-tool.cpp' ---- src/ui/tool/node-tool.cpp 2013-01-26 19:33:04 +0000 -+++ src/ui/tool/node-tool.cpp 2013-03-19 00:31:25 +0000 -@@ -488,7 +488,7 @@ - c->transform(over_item->i2dt_affine()); - 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, -+ 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); - nt->flash_tempitem = desktop->add_temporary_canvasitem(flash, - -=== modified file 'src/ui/widget/Makefile_insert' ---- src/ui/widget/Makefile_insert 2013-01-08 12:06:44 +0000 -+++ src/ui/widget/Makefile_insert 2013-03-17 14:17:34 +0000 -@@ -4,6 +4,8 @@ - ui/widget/attr-widget.h \ - ui/widget/button.h \ - ui/widget/button.cpp \ -+ ui/widget/clipmaskicon.cpp \ -+ ui/widget/clipmaskicon.h \ - ui/widget/color-picker.cpp \ - ui/widget/color-picker.h \ - ui/widget/color-preview.cpp \ -@@ -23,6 +25,8 @@ - ui/widget/gimpspinscale.h \ - ui/widget/gimpcolorwheel.c \ - ui/widget/gimpcolorwheel.h \ -+ ui/widget/highlight-picker.cpp \ -+ ui/widget/highlight-picker.h \ - ui/widget/frame.cpp \ - ui/widget/frame.h \ - ui/widget/imageicon.cpp \ -@@ -33,6 +37,8 @@ - ui/widget/labelled.h \ - ui/widget/layer-selector.cpp \ - ui/widget/layer-selector.h \ -+ ui/widget/layertypeicon.cpp \ -+ ui/widget/layertypeicon.h \ - ui/widget/licensor.cpp \ - ui/widget/licensor.h \ - ui/widget/notebook-page.cpp \ - -=== added file 'src/ui/widget/clipmaskicon.cpp' ---- src/ui/widget/clipmaskicon.cpp 1970-01-01 00:00:00 +0000 -+++ src/ui/widget/clipmaskicon.cpp 2013-03-14 23:36:37 +0000 -@@ -0,0 +1,177 @@ -+/* -+ * 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/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 : -+ -+ - -=== added file 'src/ui/widget/clipmaskicon.h' ---- src/ui/widget/clipmaskicon.h 1970-01-01 00:00:00 +0000 -+++ src/ui/widget/clipmaskicon.h 2013-03-08 04:27:35 +0000 -@@ -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 <glibmm/property.h> -+#include <gtkmm/cellrendererpixbuf.h> -+#include <gtkmm/widget.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 : - -=== added file 'src/ui/widget/highlight-picker.cpp' ---- src/ui/widget/highlight-picker.cpp 1970-01-01 00:00:00 +0000 -+++ src/ui/widget/highlight-picker.cpp 2013-03-08 04:27:35 +0000 -@@ -0,0 +1,176 @@ -+/* -+ * Authors: -+ * Theodore Janeczko -+ * -+ * Copyright (C) Theodore Janeczko 2012 <flutterguy317@gmail.com> -+ * -+ * Released under GNU GPL, read the file 'COPYING' for more information -+ */ -+ -+#include <glibmm/i18n.h> -+#include "display/cairo-utils.h" -+ -+#include <gtkmm/icontheme.h> -+ -+#include "highlight-picker.h" -+#include "widgets/icon.h" -+#include "widgets/toolbox.h" -+#include "ui/icon-names.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 -+ -+/* -+ 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 : -+ -+ - -=== added file 'src/ui/widget/highlight-picker.h' ---- src/ui/widget/highlight-picker.h 1970-01-01 00:00:00 +0000 -+++ src/ui/widget/highlight-picker.h 2013-03-08 04:27:35 +0000 -@@ -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 <glibmm/property.h> -+#include <gtkmm/cellrendererpixbuf.h> -+#include <gtkmm/widget.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 : - -=== added file 'src/ui/widget/layertypeicon.cpp' ---- src/ui/widget/layertypeicon.cpp 1970-01-01 00:00:00 +0000 -+++ src/ui/widget/layertypeicon.cpp 2013-03-08 04:27:35 +0000 -@@ -0,0 +1,167 @@ -+/* -+ * 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/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 : -+ -+ - -=== added file 'src/ui/widget/layertypeicon.h' ---- src/ui/widget/layertypeicon.h 1970-01-01 00:00:00 +0000 -+++ src/ui/widget/layertypeicon.h 2013-03-08 04:27:35 +0000 -@@ -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 <glibmm/property.h> -+#include <gtkmm/cellrendererpixbuf.h> -+#include <gtkmm/widget.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 : - -=== modified file 'src/verbs.cpp' ---- src/verbs.cpp 2013-03-04 17:21:11 +0000 -+++ src/verbs.cpp 2013-03-17 14:29:16 +0000 -@@ -1980,6 +1980,9 @@ - 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_LIVE_PATH_EFFECT: - dt->_dlg_mgr->showDialog("LivePathEffect"); - break; -@@ -2791,6 +2794,8 @@ - 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_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..."), - -=== modified file 'src/verbs.h' ---- src/verbs.h 2013-03-04 17:21:11 +0000 -+++ src/verbs.h 2013-03-17 14:28:15 +0000 -@@ -285,6 +285,7 @@ - SP_VERB_DIALOG_INPUT, - SP_VERB_DIALOG_EXTENSIONEDITOR, - SP_VERB_DIALOG_LAYERS, -+ SP_VERB_DIALOG_OBJECTS, - SP_VERB_DIALOG_LIVE_PATH_EFFECT, - SP_VERB_DIALOG_FILTER_EFFECTS, - SP_VERB_DIALOG_SVG_FONTS, - diff --git a/share/palettes/MLP/Makefile b/share/palettes/MLP/Makefile deleted file mode 100644 index 80a23cafd..000000000 --- a/share/palettes/MLP/Makefile +++ /dev/null @@ -1,524 +0,0 @@ -# Makefile.in generated by automake 1.11.1 from Makefile.am. -# share/palettes/MLP/Makefile. Generated from Makefile.in by configure. - -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, -# Inc. -# This Makefile.in is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY, to the extent permitted by law; without -# even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. - - - - -pkgdatadir = $(datadir)/inkscape -pkgincludedir = $(includedir)/inkscape -pkglibdir = $(libdir)/inkscape -pkglibexecdir = $(libexecdir)/inkscape -am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -install_sh_DATA = $(install_sh) -c -m 644 -install_sh_PROGRAM = $(install_sh) -c -install_sh_SCRIPT = $(install_sh) -c -INSTALL_HEADER = $(INSTALL_DATA) -transform = $(program_transform_name) -NORMAL_INSTALL = : -PRE_INSTALL = : -POST_INSTALL = : -NORMAL_UNINSTALL = : -PRE_UNINSTALL = : -POST_UNINSTALL = : -build_triplet = x86_64-unknown-linux-gnu -host_triplet = x86_64-unknown-linux-gnu -subdir = share/palettes/MLP -DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/m4/gettext.m4 \ - $(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intlmacosx.m4 \ - $(top_srcdir)/m4/intltool.m4 $(top_srcdir)/m4/lib-ld.m4 \ - $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.m4 \ - $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ - $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ - $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \ - $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ - $(top_srcdir)/acinclude.m4 $(top_srcdir)/m4/ac_define_dir.m4 \ - $(top_srcdir)/m4/relaytool.m4 \ - $(top_srcdir)/m4/ink_bzr_snapshot_build.m4 \ - $(top_srcdir)/configure.ac -am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ - $(ACLOCAL_M4) -mkinstalldirs = $(install_sh) -d -CONFIG_HEADER = $(top_builddir)/config.h -CONFIG_CLEAN_FILES = -CONFIG_CLEAN_VPATH_FILES = -AM_V_GEN = $(am__v_GEN_$(V)) -am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY)) -am__v_GEN_0 = @echo " GEN " $@; -AM_V_at = $(am__v_at_$(V)) -am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY)) -am__v_at_0 = @ -SOURCES = -DIST_SOURCES = -am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; -am__vpath_adj = case $$p in \ - $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ - *) f=$$p;; \ - esac; -am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; -am__install_max = 40 -am__nobase_strip_setup = \ - srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` -am__nobase_strip = \ - for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" -am__nobase_list = $(am__nobase_strip_setup); \ - for p in $$list; do echo "$$p $$p"; done | \ - sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ - $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ - if (++n[$$2] == $(am__install_max)) \ - { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ - END { for (dir in files) print dir, files[dir] }' -am__base_list = \ - sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ - sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' -am__installdirs = "$(DESTDIR)$(MLPdir)" -DATA = $(MLP_DATA) -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -ACLOCAL = ${SHELL} /home/inkscape-diff/build-aux/missing --run aclocal-1.11 -ALL_LINGUAS = -AMTAR = ${SHELL} /home/inkscape-diff/build-aux/missing --run tar -AM_DEFAULT_VERBOSITY = 0 -AR = ar -AUTOCONF = ${SHELL} /home/inkscape-diff/build-aux/missing --run autoconf -AUTOHEADER = ${SHELL} /home/inkscape-diff/build-aux/missing --run autoheader -AUTOMAKE = ${SHELL} /home/inkscape-diff/build-aux/missing --run automake-1.11 -AWK = mawk -CAIRO_PDF_CFLAGS = -pthread -I/usr/include/cairo -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -I/usr/include/pixman-1 -I/usr/include/freetype2 -I/usr/include/libpng12 -CAIRO_PDF_LIBS = -lz -lcairo -CAIRO_SVG_CFLAGS = -pthread -I/usr/include/cairo -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -I/usr/include/pixman-1 -I/usr/include/freetype2 -I/usr/include/libpng12 -CAIRO_SVG_LIBS = -lcairo -CARBON_LDFLAGS = -CC = gcc -CCAS = gcc -CCASDEPMODE = depmode=gcc3 -CCASFLAGS = -g -O2 -CCDEPMODE = depmode=gcc3 -CFLAGS = -Wno-pointer-sign -g -O2 -CPP = gcc -E -CPPFLAGS = -DG_DISABLE_DEPRECATED -DGLIBMM_DISABLE_DEPRECATED -DGDKMM_DISABLE_DEPRECATED -DGTK_DISABLE_SINGLE_INCLUDES -DGTK_DISABLE_DEPRECATED -DGTKMM_DISABLE_DEPRECATED -Werror=format-security -DGSEAL_ENABLE -DG_DISABLE_SINGLE_INCLUDES -Wall -Wformat -Wformat-security -W -D_FORTIFY_SOURCE=2 -CXX = g++ -CXXCPP = g++ -E -CXXDEPMODE = depmode=gcc3 -CXXFLAGS = -Wpointer-arith -Wcast-align -Wsign-compare -Woverloaded-virtual -Wswitch -Wno-unused-parameter -g -O2 -fopenmp -CYGPATH_W = echo -DATADIRNAME = share -DBUSSERVICEDIR = -DBUS_CFLAGS = -DBUS_LIBS = -DEFS = -DHAVE_CONFIG_H -DEPDIR = .deps -DLLTOOL = false -DSYMUTIL = -DUMPBIN = -ECHO_C = -ECHO_N = -n -ECHO_T = -EGREP = /bin/grep -E -EXEEXT = -EXIF_CFLAGS = -I/usr/include/libexif -EXIF_LIBS = -lexif -FGREP = /bin/grep -F -FREETYPE_CFLAGS = -I/usr/include/freetype2 -FREETYPE_CONFIG = /usr/bin/freetype-config -FREETYPE_LIBS = -L/usr/lib/x86_64-linux-gnu -lfreetype -lz -GDL_3_6_CFLAGS = -GDL_3_6_LIBS = -GETTEXT_MACRO_VERSION = 0.17 -GETTEXT_PACKAGE = inkscape -GLIBMM_2_32_CFLAGS = -GLIBMM_2_32_LIBS = -GMSGFMT = /usr/bin/msgfmt -GMSGFMT_015 = /usr/bin/msgfmt -GNOME_VFS_CFLAGS = -pthread -I/usr/include/dbus-1.0 -I/usr/lib/x86_64-linux-gnu/dbus-1.0/include -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -I/usr/include/gnome-vfs-2.0 -I/usr/lib/gnome-vfs-2.0/include -I/usr/include/gconf/2 -GNOME_VFS_LIBS = -pthread -lgnomevfs-2 -lgconf-2 -lgmodule-2.0 -lgobject-2.0 -lgthread-2.0 -lrt -lglib-2.0 -GREP = /bin/grep -GTK_CFLAGS = -pthread -I/usr/include/gtk-2.0 -I/usr/lib/x86_64-linux-gnu/gtk-2.0/include -I/usr/include/atk-1.0 -I/usr/include/cairo -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/pango-1.0 -I/usr/include/gio-unix-2.0/ -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -I/usr/include/pixman-1 -I/usr/include/freetype2 -I/usr/include/libpng12 -I/usr/include/gtk-unix-print-2.0 -I/usr/include/gdkmm-2.4 -I/usr/lib/gdkmm-2.4/include -I/usr/include/giomm-2.4 -I/usr/lib/giomm-2.4/include -I/usr/include/pangomm-1.4 -I/usr/lib/pangomm-1.4/include -I/usr/include/glibmm-2.4 -I/usr/lib/glibmm-2.4/include -I/usr/include/sigc++-2.0 -I/usr/lib/sigc++-2.0/include -I/usr/include/cairomm-1.0 -I/usr/lib/cairomm-1.0/include -I/usr/include/gtkmm-2.4 -I/usr/lib/gtkmm-2.4/include -I/usr/include/atkmm-1.6 -GTK_LIBS = -pthread -lgtkmm-2.4 -latkmm-1.6 -lgdkmm-2.4 -lgiomm-2.4 -lpangomm-1.4 -lgtk-x11-2.0 -lglibmm-2.4 -lcairomm-1.0 -lsigc-2.0 -lgdk-x11-2.0 -latk-1.0 -lgio-2.0 -lpangoft2-1.0 -lpangocairo-1.0 -lgdk_pixbuf-2.0 -lcairo -lpango-1.0 -lfreetype -lfontconfig -lgobject-2.0 -lgmodule-2.0 -lgthread-2.0 -lrt -lglib-2.0 -IMAGEMAGICK_CFLAGS = -fopenmp -I/usr/include/ImageMagick -IMAGEMAGICK_LIBS = -lMagick++ -lMagickCore -INKSCAPE_CFLAGS = -pthread -I/usr/include/gtk-2.0 -I/usr/lib/x86_64-linux-gnu/gtk-2.0/include -I/usr/include/atk-1.0 -I/usr/include/cairo -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/pango-1.0 -I/usr/include/gio-unix-2.0/ -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -I/usr/include/pixman-1 -I/usr/include/freetype2 -I/usr/include/libpng12 -I/usr/include/gtk-unix-print-2.0 -I/usr/include/gdkmm-2.4 -I/usr/lib/gdkmm-2.4/include -I/usr/include/giomm-2.4 -I/usr/lib/giomm-2.4/include -I/usr/include/pangomm-1.4 -I/usr/lib/pangomm-1.4/include -I/usr/include/glibmm-2.4 -I/usr/lib/glibmm-2.4/include -I/usr/include/sigc++-2.0 -I/usr/lib/sigc++-2.0/include -I/usr/include/cairomm-1.0 -I/usr/lib/cairomm-1.0/include -I/usr/include/gtkmm-2.4 -I/usr/lib/gtkmm-2.4/include -I/usr/include/atkmm-1.6 -pthread -I/usr/include/cairo -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -I/usr/include/pixman-1 -I/usr/include/freetype2 -I/usr/include/libpng12 -I/usr/include/pango-1.0 -I/usr/include/cairomm-1.0 -I/usr/lib/cairomm-1.0/include -I/usr/include/sigc++-2.0 -I/usr/lib/sigc++-2.0/include -I/usr/include/glibmm-2.4 -I/usr/lib/glibmm-2.4/include -I/usr/include/giomm-2.4 -I/usr/lib/giomm-2.4/include -I/usr/include/libxml2 -INKSCAPE_DATADIR = /usr/local/share -INKSCAPE_LIBS = -pthread -lgtkmm-2.4 -latkmm-1.6 -lgdkmm-2.4 -lgiomm-2.4 -lpangomm-1.4 -lgtk-x11-2.0 -lglibmm-2.4 -lcairomm-1.0 -lsigc-2.0 -lgdk-x11-2.0 -latk-1.0 -lgio-2.0 -lpangoft2-1.0 -lpangocairo-1.0 -lgdk_pixbuf-2.0 -lcairo -lpango-1.0 -lfreetype -lfontconfig -lgobject-2.0 -lgmodule-2.0 -lgthread-2.0 -lrt -lglib-2.0 -pthread -lgc -lcairomm-1.0 -lcairo -lgiomm-2.4 -lgio-2.0 -lglibmm-2.4 -lgsl -lgslcblas -lm -lpng12 -lxslt -lxml2 -lpangoft2-1.0 -lpango-1.0 -lfreetype -lfontconfig -lgobject-2.0 -lgmodule-2.0 -lgthread-2.0 -lrt -lglib-2.0 -lsigc-2.0 -lz -lxml2 -ldl -lgomp -lpopt -laspell -INSTALL = /usr/bin/install -c -INSTALL_DATA = ${INSTALL} -m 644 -INSTALL_PROGRAM = ${INSTALL} -INSTALL_SCRIPT = ${INSTALL} -INSTALL_STRIP_PROGRAM = $(install_sh) -c -s -INTLLIBS = -INTLTOOL_EXTRACT = /usr/bin/intltool-extract -INTLTOOL_MERGE = /usr/bin/intltool-merge -INTLTOOL_PERL = /usr/bin/perl -INTLTOOL_UPDATE = /usr/bin/intltool-update -INTL_MACOSX_LIBS = -LCMS2_CFLAGS = -LCMS2_LIBS = -LCMS_CFLAGS = -LCMS_LIBS = -llcms -LD = /usr/bin/ld -m elf_x86_64 -LDFLAGS = -Wl,-z,relro -LIBCDR_CFLAGS = -LIBCDR_LIBS = -LIBICONV = -liconv -LIBINTL = -LIBOBJS = -LIBS = -ljpeg -llcms -lpoppler -pthread -lpoppler-glib -lgdk-x11-2.0 -lpoppler -lpangocairo-1.0 -lgdk_pixbuf-2.0 -lpango-1.0 -lcairo -lgmodule-2.0 -lgobject-2.0 -lgthread-2.0 -lrt -lglib-2.0 -LIBTOOL = $(SHELL) $(top_builddir)/libtool -LIBVISIO_CFLAGS = -LIBVISIO_LIBS = -LIBWPG01_CFLAGS = -LIBWPG01_LIBS = -LIBWPG02_CFLAGS = -I/usr/include/libwpg-0.2 -I/usr/include/libwpd-0.9 -LIBWPG02_LIBS = -lwpg-0.2 -lwpd-0.9 -lwpd-stream-0.9 -LIBWPG_CFLAGS = -I/usr/include/libwpg-0.2 -I/usr/include/libwpd-0.9 -LIBWPG_LIBS = -lwpg-0.2 -lwpd-0.9 -lwpd-stream-0.9 -LIPO = -LN_S = ln -s -LTLIBICONV = -liconv -LTLIBINTL = -LTLIBOBJS = -MAKEINFO = ${SHELL} /home/inkscape-diff/build-aux/missing --run makeinfo -MANIFEST_TOOL = : -MKDIR_P = /bin/mkdir -p -MSGFMT = /usr/bin/msgfmt -MSGFMT_015 = /usr/bin/msgfmt -MSGMERGE = /usr/bin/msgmerge -NM = /usr/bin/nm -B -NMEDIT = -OBJDUMP = objdump -OBJEXT = o -OPENMP_CXXFLAGS = -fopenmp -OTOOL = -OTOOL64 = -PACKAGE = inkscape -PACKAGE_BUGREPORT = http://bugs.launchpad.net/inkscape/+filebug -PACKAGE_LOCALE_DIR = /usr/local/share/locale -PACKAGE_NAME = inkscape -PACKAGE_STRING = inkscape 0.48+devel -PACKAGE_TARNAME = inkscape -PACKAGE_URL = http://inkscape.org/ -PACKAGE_VERSION = 0.48+devel -PANGO_USES_DEPRECATED_GLIB_SYMBOLS_CFLAGS = -PANGO_USES_DEPRECATED_GLIB_SYMBOLS_LIBS = -PATH_SEPARATOR = : -PKG_CONFIG = /usr/bin/pkg-config -PKG_CONFIG_LIBDIR = -PKG_CONFIG_PATH = -POPPLER_CAIRO_CFLAGS = -pthread -I/usr/include/cairo -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -I/usr/include/pixman-1 -I/usr/include/freetype2 -I/usr/include/libpng12 -I/usr/include/poppler -POPPLER_CAIRO_LIBS = -lpoppler -lcairo -POPPLER_CFLAGS = -I/usr/include/poppler -POPPLER_GFXFONT_CFLAGS = -I/usr/include/poppler -POPPLER_GFXFONT_LIBS = -lpoppler -POPPLER_GLIB_CFLAGS = -pthread -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -I/usr/include/cairo -I/usr/include/gtk-2.0 -I/usr/lib/x86_64-linux-gnu/gtk-2.0/include -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/pixman-1 -I/usr/include/freetype2 -I/usr/include/libpng12 -I/usr/include/gio-unix-2.0/ -I/usr/include/pango-1.0 -I/usr/include/poppler/glib -I/usr/include/poppler -POPPLER_GLIB_LIBS = -pthread -lpoppler-glib -lgdk-x11-2.0 -lpoppler -lpangocairo-1.0 -lgdk_pixbuf-2.0 -lpango-1.0 -lcairo -lgmodule-2.0 -lgobject-2.0 -lgthread-2.0 -lrt -lglib-2.0 -POPPLER_LIBS = -lpoppler -pthread -lpoppler-glib -lgdk-x11-2.0 -lpoppler -lpangocairo-1.0 -lgdk_pixbuf-2.0 -lpango-1.0 -lcairo -lgmodule-2.0 -lgobject-2.0 -lgthread-2.0 -lrt -lglib-2.0 -POPPLER_NEWERRORAPI_CFLAGS = -POPPLER_NEWERRORAPI_LIBS = -POSUB = po -POW_LIB = -RANLIB = ranlib -SED = /bin/sed -SET_MAKE = -SHELL = /bin/bash -STRIP = strip -USE_NLS = yes -VERSION = 0.48+devel -WIN32_CFLAGS = -X11_CFLAGS = -X11_LIBS = -lX11 -XGETTEXT = /usr/bin/xgettext -XGETTEXT_015 = /usr/bin/xgettext -XGETTEXT_EXTRA_OPTIONS = -abs_builddir = /home/inkscape-diff/share/palettes/MLP -abs_srcdir = /home/inkscape-diff/share/palettes/MLP -abs_top_builddir = /home/inkscape-diff -abs_top_srcdir = /home/inkscape-diff -ac_ct_AR = ar -ac_ct_CC = gcc -ac_ct_CXX = g++ -ac_ct_DUMPBIN = -am__include = include -am__leading_dot = . -am__quote = -am__tar = tar --format=posix -chf - "$$tardir" -am__untar = tar -xf - -bindir = ${exec_prefix}/bin -build = x86_64-unknown-linux-gnu -build_alias = -build_cpu = x86_64 -build_os = linux-gnu -build_vendor = unknown -builddir = . -datadir = ${datarootdir} -datarootdir = ${prefix}/share -docdir = ${datarootdir}/doc/${PACKAGE_TARNAME} -dvidir = ${docdir} -exec_prefix = ${prefix} -host = x86_64-unknown-linux-gnu -host_alias = -host_cpu = x86_64 -host_os = linux-gnu -host_vendor = unknown -htmldir = ${docdir} -includedir = ${prefix}/include -infodir = ${datarootdir}/info -install_sh = ${SHELL} /home/inkscape-diff/build-aux/install-sh -libdir = ${exec_prefix}/lib -libexecdir = ${exec_prefix}/libexec -localedir = ${datarootdir}/locale -localstatedir = ${prefix}/var -mandir = ${datarootdir}/man -mkdir_p = /bin/mkdir -p -oldincludedir = /usr/include -pdfdir = ${docdir} -prefix = /usr/local -program_transform_name = s,x,x, -psdir = ${docdir} -sbindir = ${exec_prefix}/sbin -sharedstatedir = ${prefix}/com -srcdir = . -sysconfdir = ${prefix}/etc -target_alias = -top_build_prefix = ../../../ -top_builddir = ../../.. -top_srcdir = ../../.. -MLPdir = $(datadir)/inkscape/palettes/MLP -MLP_DATA = \ - All.gpl \ - Applejack.gpl \ - Daisy.gpl \ - Fluttershy.gpl \ - Lily.gpl \ - Pinkie.gpl \ - Rainbow-Dash.gpl \ - Rarity.gpl \ - Roseluck.gpl \ - Silver-Rains.gpl \ - Spike.gpl \ - Twilight-Sparkle.gpl - -EXTRA_DIST = $(MLP_DATA) -all: all-am - -.SUFFIXES: -$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) - @for dep in $?; do \ - case '$(am__configure_deps)' in \ - *$$dep*) \ - ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ - && { if test -f $@; then exit 0; else break; fi; }; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign share/palettes/MLP/Makefile'; \ - $(am__cd) $(top_srcdir) && \ - $(AUTOMAKE) --foreign share/palettes/MLP/Makefile -.PRECIOUS: Makefile -Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status - @case '$?' in \ - *config.status*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ - *) \ - echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ - cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ - esac; - -$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -$(top_srcdir)/configure: $(am__configure_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(ACLOCAL_M4): $(am__aclocal_m4_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(am__aclocal_m4_deps): - -mostlyclean-libtool: - -rm -f *.lo - -clean-libtool: - -rm -rf .libs _libs -install-MLPDATA: $(MLP_DATA) - @$(NORMAL_INSTALL) - test -z "$(MLPdir)" || $(MKDIR_P) "$(DESTDIR)$(MLPdir)" - @list='$(MLP_DATA)'; test -n "$(MLPdir)" || list=; \ - for p in $$list; do \ - if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ - echo "$$d$$p"; \ - done | $(am__base_list) | \ - while read files; do \ - echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(MLPdir)'"; \ - $(INSTALL_DATA) $$files "$(DESTDIR)$(MLPdir)" || exit $$?; \ - done - -uninstall-MLPDATA: - @$(NORMAL_UNINSTALL) - @list='$(MLP_DATA)'; test -n "$(MLPdir)" || list=; \ - files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ - test -n "$$files" || exit 0; \ - echo " ( cd '$(DESTDIR)$(MLPdir)' && rm -f" $$files ")"; \ - cd "$(DESTDIR)$(MLPdir)" && rm -f $$files -tags: TAGS -TAGS: - -ctags: CTAGS -CTAGS: - - -distdir: $(DISTFILES) - @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ - list='$(DISTFILES)'; \ - dist_files=`for file in $$list; do echo $$file; done | \ - sed -e "s|^$$srcdirstrip/||;t" \ - -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ - case $$dist_files in \ - */*) $(MKDIR_P) `echo "$$dist_files" | \ - sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ - sort -u` ;; \ - esac; \ - for file in $$dist_files; do \ - if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ - if test -d $$d/$$file; then \ - dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ - if test -d "$(distdir)/$$file"; then \ - find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ - fi; \ - if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ - find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ - fi; \ - cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ - else \ - test -f "$(distdir)/$$file" \ - || cp -p $$d/$$file "$(distdir)/$$file" \ - || exit 1; \ - fi; \ - done -check-am: all-am -check: check-am -all-am: Makefile $(DATA) -installdirs: - for dir in "$(DESTDIR)$(MLPdir)"; do \ - test -z "$$dir" || $(MKDIR_P) "$$dir"; \ - done -install: install-am -install-exec: install-exec-am -install-data: install-data-am -uninstall: uninstall-am - -install-am: all-am - @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am - -installcheck: installcheck-am -install-strip: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install -mostlyclean-generic: - -clean-generic: - -distclean-generic: - -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) - -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) - -maintainer-clean-generic: - @echo "This command is intended for maintainers to use" - @echo "it deletes files that may require special tools to rebuild." -clean: clean-am - -clean-am: clean-generic clean-libtool mostlyclean-am - -distclean: distclean-am - -rm -f Makefile -distclean-am: clean-am distclean-generic - -dvi: dvi-am - -dvi-am: - -html: html-am - -html-am: - -info: info-am - -info-am: - -install-data-am: install-MLPDATA - -install-dvi: install-dvi-am - -install-dvi-am: - -install-exec-am: - -install-html: install-html-am - -install-html-am: - -install-info: install-info-am - -install-info-am: - -install-man: - -install-pdf: install-pdf-am - -install-pdf-am: - -install-ps: install-ps-am - -install-ps-am: - -installcheck-am: - -maintainer-clean: maintainer-clean-am - -rm -f Makefile -maintainer-clean-am: distclean-am maintainer-clean-generic - -mostlyclean: mostlyclean-am - -mostlyclean-am: mostlyclean-generic mostlyclean-libtool - -pdf: pdf-am - -pdf-am: - -ps: ps-am - -ps-am: - -uninstall-am: uninstall-MLPDATA - -.MAKE: install-am install-strip - -.PHONY: all all-am check check-am clean clean-generic clean-libtool \ - distclean distclean-generic distclean-libtool distdir dvi \ - dvi-am html html-am info info-am install install-MLPDATA \ - install-am install-data install-data-am install-dvi \ - install-dvi-am install-exec install-exec-am install-html \ - install-html-am install-info install-info-am install-man \ - install-pdf install-pdf-am install-ps install-ps-am \ - install-strip installcheck installcheck-am installdirs \ - maintainer-clean maintainer-clean-generic mostlyclean \ - mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ - uninstall uninstall-MLPDATA uninstall-am - - -# Tell versions [3.59,3.63) of GNU make to not export all variables. -# Otherwise a system limit (for SysV at least) may be exceeded. -.NOEXPORT: diff --git a/src/ui/dialog/swatches.cpp b/src/ui/dialog/swatches.cpp index ceda27885..c3889db46 100644 --- a/src/ui/dialog/swatches.cpp +++ b/src/ui/dialog/swatches.cpp @@ -2102,7 +2102,7 @@ SwatchesPanel::SwatchesPanel(gchar const* prefsPath, bool showLabels) : _insideV.pack_start(_insideH, Gtk::PACK_SHRINK); _scroller.add(_insideV); } else { - _scroller.property_height_request() = 45; + _scroller.property_height_request() = 20; _scroller.add(_insideH); } |
