effect.h revision 94d56a52b13080070ff669dad70d404ecc53c68e
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm#ifndef INKSCAPE_LIVEPATHEFFECT_H
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm#define INKSCAPE_LIVEPATHEFFECT_H
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm/*
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm * Inkscape::LivePathEffect
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm *
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm* Copyright (C) Johan Engelen 2007-2008 <j.b.c.engelen@utwente.nl>
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm *
ddc251b3cf95b0097b6a5ee39ea132bd4d7d5cbcjohanengelen * Released under GNU GPL, read the file 'COPYING' for more information
ddc251b3cf95b0097b6a5ee39ea132bd4d7d5cbcjohanengelen */
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm#include "display/display-forward.h"
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm#include <map>
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm#include <glibmm/ustring.h>
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm#include <2geom/forward.h>
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm#include "ui/widget/registry.h"
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm#include "sp-lpe-item.h"
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm#include "knotholder.h"
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm#include "parameter/bool.h"
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm#include "effect-enum.h"
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm#define LPE_CONVERSION_TOLERANCE 0.01 // FIXME: find good solution for this.
d9c673867f424647c1586c356cc0ac1d34d0a98ajohanengelen
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrmstruct SPDocument;
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrmstruct SPDesktop;
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrmstruct SPItem;
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrmclass SPNodeContext;
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrmstruct LivePathEffectObject;
ddc251b3cf95b0097b6a5ee39ea132bd4d7d5cbcjohanengelenclass SPLPEItem;
ddc251b3cf95b0097b6a5ee39ea132bd4d7d5cbcjohanengelenclass KnotHolder;
ddc251b3cf95b0097b6a5ee39ea132bd4d7d5cbcjohanengelenclass KnotHolderEntity;
ddc251b3cf95b0097b6a5ee39ea132bd4d7d5cbcjohanengelen
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrmnamespace Gtk {
8c39cbeab9949a0a7d6ae66b768a7352019e42f8johanengelen class Widget;
072916d0ef7dccd696b59381f50bcf776abccefbjohanengelen class VBox;
dc98accfae7a38326b92d74fa4330ac8ccb5b778jfbarraud class Tooltips;
dc98accfae7a38326b92d74fa4330ac8ccb5b778jfbarraud}
dc98accfae7a38326b92d74fa4330ac8ccb5b778jfbarraud
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrmnamespace Inkscape {
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrmnamespace XML {
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm class Node;
8d9f5d586a04809427ce1df284a5720112177991cilix}
70eb1fc448cb08acf3468f80fa2296c03b32afd2cilix
c169f6cddd2da06cfb761339f445bbd8866f72a8buliabyaknamespace NodePath {
6f4a90e526af850ffc36064f58f09c190f3b633fjohanengelen class Path ;
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm}
56542e2b97ec8826cc692153b0e2d4f5ac8ef913johanengelen
56542e2b97ec8826cc692153b0e2d4f5ac8ef913johanengelennamespace LivePathEffect {
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrmenum LPEPathFlashType {
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm SUPPRESS_FLASH,
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm// PERMANENT_FLASH,
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm DEFAULT
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm};
072916d0ef7dccd696b59381f50bcf776abccefbjohanengelen
8c39cbeab9949a0a7d6ae66b768a7352019e42f8johanengelenclass Effect {
dc98accfae7a38326b92d74fa4330ac8ccb5b778jfbarraudpublic:
dc98accfae7a38326b92d74fa4330ac8ccb5b778jfbarraud static Effect* New(EffectType lpenr, LivePathEffectObject *lpeobj);
dc98accfae7a38326b92d74fa4330ac8ccb5b778jfbarraud static void createAndApply(const char* name, SPDocument *doc, SPItem *item);
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm static void createAndApply(EffectType type, SPDocument *doc, SPItem *item);
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm virtual ~Effect();
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm EffectType effectType ();
8d9f5d586a04809427ce1df284a5720112177991cilix
8d9f5d586a04809427ce1df284a5720112177991cilix virtual void doOnApply (SPLPEItem *lpeitem);
70eb1fc448cb08acf3468f80fa2296c03b32afd2cilix virtual void doBeforeEffect (SPLPEItem *lpeitem);
c169f6cddd2da06cfb761339f445bbd8866f72a8buliabyak
6f4a90e526af850ffc36064f58f09c190f3b633fjohanengelen void writeParamsToSVG();
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm virtual void acceptParamPath (SPPath *param_path);
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm static int acceptsNumClicks(EffectType type);
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm int acceptsNumClicks() { return acceptsNumClicks(effectType()); }
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm void doAcceptPathPreparations(SPLPEItem *lpeitem);
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm /*
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm * isReady() indicates whether all preparations which are necessary to apply the LPE are done,
8c39cbeab9949a0a7d6ae66b768a7352019e42f8johanengelen * e.g., waiting for a parameter path either before the effect is created or when it needs a
92fe3142613d000eff89db8a983b3b18b14eee79johanengelen * path as argument. This is set in sp_lpe_item_add_path_effect().
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm */
072916d0ef7dccd696b59381f50bcf776abccefbjohanengelen inline bool isReady() { return is_ready; }
92fe3142613d000eff89db8a983b3b18b14eee79johanengelen inline void setReady(bool ready = true) { is_ready = ready; }
42e99769805c14a5cc01c805faa3c3b03f9dd1c0johanengelen
dc98accfae7a38326b92d74fa4330ac8ccb5b778jfbarraud virtual void doEffect (SPCurve * curve);
92fe3142613d000eff89db8a983b3b18b14eee79johanengelen
dc98accfae7a38326b92d74fa4330ac8ccb5b778jfbarraud virtual Gtk::Widget * newWidget(Gtk::Tooltips * tooltips);
dc98accfae7a38326b92d74fa4330ac8ccb5b778jfbarraud
92fe3142613d000eff89db8a983b3b18b14eee79johanengelen /**
dc98accfae7a38326b92d74fa4330ac8ccb5b778jfbarraud * Sets all parameters to their default values and writes them to SVG.
dc98accfae7a38326b92d74fa4330ac8ccb5b778jfbarraud */
92fe3142613d000eff89db8a983b3b18b14eee79johanengelen virtual void resetDefaults(SPItem * item);
dc98accfae7a38326b92d74fa4330ac8ccb5b778jfbarraud
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm virtual void setup_nodepath(Inkscape::NodePath::Path *np);
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm
92fe3142613d000eff89db8a983b3b18b14eee79johanengelen /// /todo: is this method really necessary? it causes UI inconsistensies... (johan)
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm virtual void transform_multiply(Geom::Matrix const& postmul, bool set);
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm
92fe3142613d000eff89db8a983b3b18b14eee79johanengelen // /TODO: providesKnotholder() is currently used as an indicator of whether a nodepath is
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm // created for an item or not. When we allow both at the same time, this needs rethinking!
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm bool providesKnotholder();
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm // /TODO: in view of providesOwnFlashPaths() below, this is somewhat redundant
92fe3142613d000eff89db8a983b3b18b14eee79johanengelen // (but spiro lpe still needs it!)
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm virtual LPEPathFlashType pathFlashType() { return DEFAULT; }
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm void addHandles(KnotHolder *knotholder, SPDesktop *desktop, SPItem *item);
92fe3142613d000eff89db8a983b3b18b14eee79johanengelen std::vector<Geom::PathVector> getHelperPaths(SPLPEItem *lpeitem);
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm
8d9f5d586a04809427ce1df284a5720112177991cilix inline bool providesOwnFlashPaths() {
92fe3142613d000eff89db8a983b3b18b14eee79johanengelen return provides_own_flash_paths || show_orig_path;
8d9f5d586a04809427ce1df284a5720112177991cilix }
70eb1fc448cb08acf3468f80fa2296c03b32afd2cilix inline bool showOrigPath() { return show_orig_path; }
92fe3142613d000eff89db8a983b3b18b14eee79johanengelen
70eb1fc448cb08acf3468f80fa2296c03b32afd2cilix Glib::ustring getName();
c169f6cddd2da06cfb761339f445bbd8866f72a8buliabyak Inkscape::XML::Node * getRepr();
c169f6cddd2da06cfb761339f445bbd8866f72a8buliabyak SPDocument * getSPDoc();
c169f6cddd2da06cfb761339f445bbd8866f72a8buliabyak LivePathEffectObject * getLPEObj() {return lpeobj;};
6f4a90e526af850ffc36064f58f09c190f3b633fjohanengelen Parameter * getParameter(const char * key);
6f4a90e526af850ffc36064f58f09c190f3b633fjohanengelen
6f4a90e526af850ffc36064f58f09c190f3b633fjohanengelen void readallParameters(Inkscape::XML::Node * repr);
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm void setParameter(const gchar * key, const gchar * new_value);
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm inline bool isVisible() { return is_visible; }
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm void editNextParamOncanvas(SPItem * item, SPDesktop * desktop);
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrmprotected:
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm Effect(LivePathEffectObject *lpeobject);
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm // provide a set of doEffect functions so the developer has a choice
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm // of what kind of input/output parameters he desires.
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm // the order in which they appear is the order in which they are
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm // called by this base class. (i.e. doEffect(SPCurve * curve) defaults to calling
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm // doEffect(std::vector<Geom::Path> )
fbb4eb8b63e74d9441220a73a8ca858425be4bd4johanengelen virtual std::vector<Geom::Path>
fbb4eb8b63e74d9441220a73a8ca858425be4bd4johanengelen doEffect_path (std::vector<Geom::Path> const & path_in);
fbb4eb8b63e74d9441220a73a8ca858425be4bd4johanengelen virtual Geom::Piecewise<Geom::D2<Geom::SBasis> >
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm doEffect_pwd2 (Geom::Piecewise<Geom::D2<Geom::SBasis> > const & pwd2_in);
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm void registerParameter(Parameter * param);
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm void registerKnotHolderHandle(KnotHolderEntity* entity, const char* descr);
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm Parameter * getNextOncanvasEditableParam();
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm void addKnotHolderEntities(KnotHolder *knotholder, SPDesktop *desktop, SPItem *item);
eaa9bdc7bf7b73397e536edd47490d84e4420bd8bryce
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm //virtual std::vector<Geom::PathVector> getCanvasIndicators(SPLPEItem *lpeitem);
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm virtual void addCanvasIndicators(SPLPEItem *lpeitem, std::vector<Geom::PathVector> &hp_vec);
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm std::vector<Parameter *> param_vector;
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm std::vector<std::pair<KnotHolderEntity*, const char*> > kh_entity_vector;
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm int oncanvasedit_it;
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm BoolParam is_visible;
23d859f2ce09c04ed802cb4912cc9c50f512f0a2bgk
2d107ef9730aff3f4d776ae0c2f7d983e289ce02joncruz bool show_orig_path; // set this to true in derived effects to automatically have the original
23d859f2ce09c04ed802cb4912cc9c50f512f0a2bgk // path displayed as helperpath
23d859f2ce09c04ed802cb4912cc9c50f512f0a2bgk
23d859f2ce09c04ed802cb4912cc9c50f512f0a2bgk Inkscape::UI::Widget::Registry wr;
23d859f2ce09c04ed802cb4912cc9c50f512f0a2bgk
23d859f2ce09c04ed802cb4912cc9c50f512f0a2bgk LivePathEffectObject *lpeobj;
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm // this boolean defaults to false, it concatenates the input path to one pwd2,
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm // instead of normally 'splitting' the path into continuous pwd2 paths.
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm bool concatenate_before_pwd2;
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrmprivate:
5675f17bbbc00f2c970b4d4966ce55d86775f7a6johanengelen bool provides_own_flash_paths; // if true, the standard flash path is suppressed
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm bool is_ready;
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm Effect(const Effect&);
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm Effect& operator=(const Effect&);
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm};
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm} //namespace LivePathEffect
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm} //namespace Inkscape
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm
5675f17bbbc00f2c970b4d4966ce55d86775f7a6johanengelen#endif
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm/*
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm Local Variables:
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm mode:c++
5675f17bbbc00f2c970b4d4966ce55d86775f7a6johanengelen c-file-style:"stroustrup"
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm indent-tabs-mode:nil
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm fill-column:99
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm End:
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm*/
ab5f33e91458710ed8dd2b2a1b3a53e4227d4856johanengelen// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4 :
feb44ad276e996ca244e071f936c61b009bd73f4johanengelen