X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Flive_effects%2Feffect.h;h=6acba000ce5f9376dc7802190dfcaf37f68a1959;hb=0dc33d4ce43e0bb49c63aa53b826ec4a1ff68e28;hp=0ebd5d5a586da4372f3998550f13eb446c005541;hpb=981b809bc6ed10a21e89444d9447e5475801874f;p=inkscape.git diff --git a/src/live_effects/effect.h b/src/live_effects/effect.h index 0ebd5d5a5..6acba000c 100644 --- a/src/live_effects/effect.h +++ b/src/live_effects/effect.h @@ -1,108 +1,186 @@ -#ifndef INKSCAPE_LIVEPATHEFFECT_H -#define INKSCAPE_LIVEPATHEFFECT_H - -/* - * Inkscape::LivePathEffect - * -* Copyright (C) Johan Engelen 2007 - * - * Released under GNU GPL, read the file 'COPYING' for more information - */ - - -#include "display/display-forward.h" -#include -#include -#include <2geom/path.h> -#include "ui/widget/registry.h" -#include "util/enums.h" - -#define LPE_CONVERSION_TOLERANCE 0.01 // FIXME: find good solution for this. - -struct SPShape; -struct SPDocument; -class NArtBpath; -struct LivePathEffectObject; - -namespace Gtk { - class Widget; - class VBox; - class Tooltips; -} - -namespace Inkscape { - -namespace XML { - class Node; -}; - -namespace LivePathEffect { - -enum EffectType { - INVALID_LPE = 0, - SKELETAL_STROKES, - SLANT, - DOEFFECTSTACK_TEST, - GEARS, - ENDTYPE_LPE // This must be last -}; - -extern const Util::EnumData LPETypeData[ENDTYPE_LPE]; -extern const Util::EnumDataConverter LPETypeConverter; - -class Parameter; - -class Effect { -public: - virtual ~Effect(); - - Glib::ustring getName(); - - virtual void doEffect (SPCurve * curve); - - static Effect* New(EffectType lpenr, LivePathEffectObject *lpeobj); - - virtual Gtk::Widget * getWidget(); - - Inkscape::XML::Node * getRepr(); - SPDocument * getSPDoc(); - - void readallParameters(Inkscape::XML::Node * repr); - void setParameter(Inkscape::XML::Node * repr, const gchar * key, const gchar * old_value, const gchar * new_value); - -protected: - Effect(LivePathEffectObject *lpeobject); - - // provide a set of doEffect functions so the developer has a choice - // of what kind of input/output parameters he desires. - // the order in which they appear is the order in which they are - // called by this base class. (i.e. doEffect(SPCurve * curve) defaults to calling - // doEffect(std::vector ) - virtual NArtBpath * - doEffect (NArtBpath * path_in); - virtual std::vector - doEffect (std::vector & path_in); - virtual Geom::Piecewise > - doEffect (Geom::Piecewise > & pwd2_in); - - void registerParameter(Parameter * param); - - typedef std::map param_map_type; - param_map_type param_map; - - Inkscape::UI::Widget::Registry wr; - Gtk::VBox * vbox; - Gtk::Tooltips * tooltips; - - LivePathEffectObject *lpeobj; - -private: - Effect(const Effect&); - Effect& operator=(const Effect&); -}; - - -}; //namespace LivePathEffect -}; //namespace Inkscape - -#endif +#ifndef INKSCAPE_LIVEPATHEFFECT_H +#define INKSCAPE_LIVEPATHEFFECT_H + +/* + * Inkscape::LivePathEffect + * +* Copyright (C) Johan Engelen 2007-2008 + * + * Released under GNU GPL, read the file 'COPYING' for more information + */ + + +#include +#include +#include <2geom/forward.h> +#include "ui/widget/registry.h" +#include "parameter/bool.h" +#include "effect-enum.h" + +#define LPE_CONVERSION_TOLERANCE 0.01 // FIXME: find good solution for this. + +struct SPDocument; +struct SPDesktop; +struct SPItem; +class SPNodeContext; +struct LivePathEffectObject; +class SPLPEItem; +class KnotHolder; +class KnotHolderEntity; +class SPPath; +struct SPCurve; + +namespace Gtk { + class Widget; + class VBox; + class Tooltips; +} + +namespace Inkscape { + +namespace XML { + class Node; +} + +namespace NodePath { + class Path ; +} + +namespace LivePathEffect { + +enum LPEPathFlashType { + SUPPRESS_FLASH, +// PERMANENT_FLASH, + DEFAULT +}; + +class Effect { +public: + static Effect* New(EffectType lpenr, LivePathEffectObject *lpeobj); + static void createAndApply(const char* name, SPDocument *doc, SPItem *item); + static void createAndApply(EffectType type, SPDocument *doc, SPItem *item); + + virtual ~Effect(); + + EffectType effectType (); + + virtual void doOnApply (SPLPEItem *lpeitem); + virtual void doBeforeEffect (SPLPEItem *lpeitem); + + void writeParamsToSVG(); + + virtual void acceptParamPath (SPPath *param_path); + static int acceptsNumClicks(EffectType type); + int acceptsNumClicks() { return acceptsNumClicks(effectType()); } + void doAcceptPathPreparations(SPLPEItem *lpeitem); + + /* + * isReady() indicates whether all preparations which are necessary to apply the LPE are done, + * e.g., waiting for a parameter path either before the effect is created or when it needs a + * path as argument. This is set in sp_lpe_item_add_path_effect(). + */ + inline bool isReady() { return is_ready; } + inline void setReady(bool ready = true) { is_ready = ready; } + + virtual void doEffect (SPCurve * curve); + + virtual Gtk::Widget * newWidget(Gtk::Tooltips * tooltips); + + /** + * Sets all parameters to their default values and writes them to SVG. + */ + virtual void resetDefaults(SPItem * item); + + /// /todo: is this method really necessary? it causes UI inconsistensies... (johan) + virtual void transform_multiply(Geom::Matrix const& postmul, bool set); + + // /TODO: providesKnotholder() is currently used as an indicator of whether a nodepath is + // created for an item or not. When we allow both at the same time, this needs rethinking! + bool providesKnotholder(); + // /TODO: in view of providesOwnFlashPaths() below, this is somewhat redundant + // (but spiro lpe still needs it!) + virtual LPEPathFlashType pathFlashType() { return DEFAULT; } + void addHandles(KnotHolder *knotholder, SPDesktop *desktop, SPItem *item); + std::vector getHelperPaths(SPLPEItem *lpeitem); + + inline bool providesOwnFlashPaths() { + return provides_own_flash_paths || show_orig_path; + } + inline bool showOrigPath() { return show_orig_path; } + + Glib::ustring getName(); + Inkscape::XML::Node * getRepr(); + SPDocument * getSPDoc(); + LivePathEffectObject * getLPEObj() {return lpeobj;}; + Parameter * getParameter(const char * key); + + void readallParameters(Inkscape::XML::Node * repr); + void setParameter(const gchar * key, const gchar * new_value); + + inline bool isVisible() { return is_visible; } + + void editNextParamOncanvas(SPItem * item, SPDesktop * desktop); + +protected: + Effect(LivePathEffectObject *lpeobject); + + // provide a set of doEffect functions so the developer has a choice + // of what kind of input/output parameters he desires. + // the order in which they appear is the order in which they are + // called by this base class. (i.e. doEffect(SPCurve * curve) defaults to calling + // doEffect(std::vector ) + virtual std::vector + doEffect_path (std::vector const & path_in); + virtual Geom::Piecewise > + doEffect_pwd2 (Geom::Piecewise > const & pwd2_in); + + void registerParameter(Parameter * param); + void registerKnotHolderHandle(KnotHolderEntity* entity, const char* descr); + Parameter * getNextOncanvasEditableParam(); + + void addKnotHolderEntities(KnotHolder *knotholder, SPDesktop *desktop, SPItem *item); + + //virtual std::vector getCanvasIndicators(SPLPEItem *lpeitem); + virtual void addCanvasIndicators(SPLPEItem *lpeitem, std::vector &hp_vec); + + + std::vector param_vector; + std::vector > kh_entity_vector; + int oncanvasedit_it; + BoolParam is_visible; + + bool show_orig_path; // set this to true in derived effects to automatically have the original + // path displayed as helperpath + + Inkscape::UI::Widget::Registry wr; + + LivePathEffectObject *lpeobj; + + // this boolean defaults to false, it concatenates the input path to one pwd2, + // instead of normally 'splitting' the path into continuous pwd2 paths. + bool concatenate_before_pwd2; + +private: + bool provides_own_flash_paths; // if true, the standard flash path is suppressed + + bool is_ready; + + Effect(const Effect&); + Effect& operator=(const Effect&); +}; + +} //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 :