summaryrefslogtreecommitdiffstats
path: root/src/live_effects/parameter/parameter.h
blob: c4e58c8d5d21ae3d5d3cb82ef055a9dfca7f483d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
#ifndef INKSCAPE_LIVEPATHEFFECT_PARAMETER_H
#define INKSCAPE_LIVEPATHEFFECT_PARAMETER_H

/*
 * Inkscape::LivePathEffectParameters
 *
* Copyright (C) Johan Engelen 2007 <j.b.c.engelen@utwente.nl>
 *
 * Released under GNU GPL, read the file 'COPYING' for more information
 */

#include <glibmm/ustring.h>
#include <2geom/forward.h>

struct SPDesktop;
struct SPItem;

namespace Gtk {
    class Widget;
    class Tooltips;
}

namespace Inkscape {

namespace NodePath {
    class Path ;
}

namespace UI {
namespace Widget {
    class Registry;
}
}

namespace LivePathEffect {

class Effect;

enum ParamType {
    GENERAL_PARAM,
    SCALAR_PARAM,
    BOOL_PARAM,
    PATH_PARAM,
    POINT_PARAM,
    RANDOM_PARAM,
    ENUM_PARAM,
    INVALID_PARAM
};

class Parameter {
public:
    Parameter(  const Glib::ustring& label,
                const Glib::ustring& tip,
                const Glib::ustring& key,
                Inkscape::UI::Widget::Registry* wr,
                Effect* effect);
    virtual ~Parameter() {};

    virtual bool param_readSVGValue(const gchar * strvalue) = 0;   // returns true if new value is valid / accepted.
    virtual gchar * param_getSVGValue() const = 0;
    void write_to_SVG() { param_write_to_repr(param_getSVGValue()); }
 
    virtual void param_set_default() = 0;

    void printTypeName();
    virtual ParamType paramType() { return GENERAL_PARAM; }

    // This creates a new widget (newed with Gtk::manage(new ...);)
    virtual Gtk::Widget * param_newWidget(Gtk::Tooltips * tooltips) = 0;

    virtual Glib::ustring * param_getTooltip() { return &param_tooltip; };

    virtual void param_editOncanvas(SPItem * /*item*/, SPDesktop * /*dt*/) {};
    virtual void param_setup_nodepath(Inkscape::NodePath::Path */*np*/) {};

    virtual void param_transform_multiply(Geom::Matrix const& /*postmul*/, bool /*set*/) {};

    Glib::ustring param_key;
    Inkscape::UI::Widget::Registry * param_wr;
    Glib::ustring param_label;

    bool oncanvas_editable;

protected:
    Glib::ustring param_tooltip;

    Effect* param_effect;

    void param_write_to_repr(const char * svgd);

private:
    Parameter(const Parameter&);
    Parameter& operator=(const Parameter&);
};


class ScalarParam : public Parameter {
public:
    ScalarParam(  const Glib::ustring& label,
                const Glib::ustring& tip,
                const Glib::ustring& key,
                Inkscape::UI::Widget::Registry* wr,
                Effect* effect,
                gdouble default_value = 1.0);
    virtual ~ScalarParam();

    virtual ParamType paramType() { return SCALAR_PARAM; }

    virtual bool param_readSVGValue(const gchar * strvalue);
    virtual gchar * param_getSVGValue() const;

    virtual void param_set_default();
    void param_set_value(gdouble val);
    void param_make_integer(bool yes = true);
    void param_set_range(gdouble min, gdouble max);
    void param_set_digits(unsigned digits);
    void param_set_increments(double step, double page);

    virtual Gtk::Widget * param_newWidget(Gtk::Tooltips * tooltips);

    inline operator gdouble()
        { return value; };

protected:
    gdouble value;
    gdouble min;
    gdouble max;
    bool integer;
    gdouble defvalue;
    unsigned digits;
    double inc_step;
    double inc_page;

private:
    ScalarParam(const ScalarParam&);
    ScalarParam& operator=(const ScalarParam&);
};

} //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:encoding=utf-8:textwidth=99 :