summaryrefslogtreecommitdiffstats
path: root/src/extension/effect.h
blob: 39307e46fb368cf7b187ede0f7454d2e870191d1 (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
// SPDX-License-Identifier: GPL-2.0-or-later
/*
 * Authors:
 *   Ted Gould <ted@gould.cx>
 *
 * Copyright (C) 2002-2004 Authors
 *
 * Released under GNU GPL v2+, read the file 'COPYING' for more information.
 */


#ifndef INKSCAPE_EXTENSION_EFFECT_H__
#define INKSCAPE_EXTENSION_EFFECT_H__

#include <glibmm/i18n.h>
#include "verbs.h"
#include "extension.h"

namespace Gtk {
	class VBox;
}

class SPDocument;

namespace Inkscape {


namespace Extension {
class PrefDialog;

/** \brief  Effects are extensions that take a document and do something
            to it in place.  This class adds the extra functions required
            to make extensions effects.
*/
class Effect : public Extension {
    /** \brief  This is the last effect that was used.  This is used in
                a menu item to rapidly recall the same effect. */
    static Effect * _last_effect;
    /** \brief  The location of the Extensions and Filters menus on the menu structure
                XML file.  This is saved so it only has to be discovered
                once. */
    static Inkscape::XML::Node * _effects_list;
    static Inkscape::XML::Node * _filters_list;
    Inkscape::XML::Node *find_menu (Inkscape::XML::Node * menustruct, const gchar *name);
    void merge_menu (Inkscape::XML::Node * base, Inkscape::XML::Node * start, Inkscape::XML::Node * pattern, Inkscape::XML::Node * merge);

    /** \brief  This is the verb type that is used for all effect's verbs.
                It provides convenience functions and maintains a pointer
                back to the effect that created it.  */
    class EffectVerb : public Inkscape::Verb {
        private:
            static void perform (SPAction * action, void * mydata);

            /** \brief  The effect that this verb represents. */
            Effect * _effect;
            /** \brief  Whether or not to show preferences on display */
            bool _showPrefs;
            /** \brief  Name with ellipses if that makes sense */
            gchar * _elip_name;
        protected:
            SPAction * make_action (Inkscape::ActionContext const & context) override;
        public:
            /** \brief Use the Verb initializer with the same parameters. */
            EffectVerb(gchar const * id,
                       gchar const * name,
                       gchar const * tip,
                       gchar const * image,
                       Effect *      effect,
                       bool          showPrefs) :
                    Verb(id, _(name), tip ? _(tip) : nullptr, image, _("Extensions")),
                    _effect(effect),
                    _showPrefs(showPrefs),
                    _elip_name(nullptr) {
                /* No clue why, but this is required */
                this->set_default_sensitive(true);
                if (_showPrefs && effect != nullptr && effect->widget_visible_count() != 0) {
                    _elip_name = g_strdup_printf("%s...", _(name));
                    set_name(_elip_name);
                }
            }

            /** \brief  Destructor */
            ~EffectVerb() override {
                if (_elip_name != nullptr) {
                    g_free(_elip_name);
                }
            }
    };

    /** \brief  ID used for the verb without preferences */
    Glib::ustring _id_noprefs;
    /** \brief  Name used for the verb without preferences */
    Glib::ustring _name_noprefs;

    /** \brief  The verb representing this effect. */
    EffectVerb _verb;
    /** \brief  The verb representing this effect.  Without preferences. */
    EffectVerb _verb_nopref;
    /** \brief  Menu node created for this effect */
    Inkscape::XML::Node * _menu_node;
    /** \brief  Whether a working dialog should be shown */
    bool _workingDialog;

    /** \brief  The preference dialog if it is shown */
    PrefDialog * _prefDialog;
public:
    Effect(Inkscape::XML::Node *in_repr, Implementation::Implementation *in_imp, std::string *base_directory);
    ~Effect  () override;

    bool check() override;

    bool         prefs   (Inkscape::UI::View::View * doc);
    void         effect  (Inkscape::UI::View::View * doc);
    /** \brief  Accessor function for a pointer to the verb */
    Inkscape::Verb * get_verb () { return &_verb; };

    /** \brief  Static function to get the last effect used */
    static Effect *  get_last_effect () { return _last_effect; };
    static void      set_last_effect (Effect * in_effect);

    static void      place_menus ();
    void             place_menu (Inkscape::XML::Node * menus);

    Gtk::VBox *    get_info_widget();

    bool no_doc; // if true, the effect does not process SVG document at all, so no need to save, read, and watch for errors
    bool no_live_preview; // if true, the effect does not need "live preview" checkbox in its dialog

    PrefDialog *get_pref_dialog ();
    void        set_pref_dialog (PrefDialog * prefdialog);
private:
    static gchar *   remove_ (gchar * instr);
};

} }  /* namespace Inkscape, Extension */
#endif /* INKSCAPE_EXTENSION_EFFECT_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 :