summaryrefslogtreecommitdiffstats
path: root/src/ui/dialog/clonetiler.h
blob: 8713d106e1358cfb91bebcd4ff1fe1b9ff1f6fb8 (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
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
// SPDX-License-Identifier: GPL-2.0-or-later
/** @file
 * @brief Clone tiling dialog
 */
/* Authors:
 *   bulia byak <buliabyak@users.sf.net>
 *
 * Copyright (C) 2004 Authors
 * Released under GNU GPL v2+, read the file 'COPYING' for more information.
 */
#ifndef __SP_CLONE_TILER_H__
#define __SP_CLONE_TILER_H__

#include "ui/dialog/dialog-base.h"
#include "ui/widget/color-picker.h"

namespace Gtk {
    class Box;
    class ComboBox;
    class Grid;
    class Notebook;
    class SizeGroup;
    class ToggleButton;
}

class SPItem;
class SPObject;

namespace Geom {
    class Rect;
    class Affine;
}

namespace Inkscape {
namespace UI {

namespace Widget {
    class CheckButtonInternal;
    class UnitMenu;
}

namespace Dialog {

class CloneTiler : public DialogBase
{
public:
    CloneTiler();
    ~CloneTiler() override;

    static CloneTiler &getInstance() { return *new CloneTiler(); }
    void show_page_trace();
protected:
    enum PickType {
        PICK_COLOR,
        PICK_OPACITY,
        PICK_R,
        PICK_G,
        PICK_B,
        PICK_H,
        PICK_S,
        PICK_L
    };

    Gtk::Box * new_tab(Gtk::Notebook *nb, const gchar *label);
    Gtk::Grid * table_x_y_rand(int values);
    Gtk::Widget * spinbox(const char          *tip,
                          const Glib::ustring &attr,
                          double               lower,
                          double               upper,
                          const gchar         *suffix,
                          bool                 exponent = false);
    Gtk::Widget * checkbox(const char          *tip,
                           const Glib::ustring &attr);
    void table_attach(Gtk::Grid *table, Gtk::Widget *widget, float align, int row, int col);

    void       symgroup_changed(Gtk::ComboBox *cb);
    void       on_picker_color_changed(guint rgba);
    void       trace_hide_tiled_clones_recursively(SPObject *from);
    guint      number_of_clones(SPObject *obj);
    void       trace_setup(SPDocument *doc, gdouble zoom, SPItem *original);
    guint32    trace_pick(Geom::Rect box);
    void       trace_finish();
    bool       is_a_clone_of(SPObject *tile, SPObject *obj);
    Geom::Rect transform_rect(Geom::Rect const &r, Geom::Affine const &m);
    double     randomize01(double val, double rand);

    void apply();
    void change_selection(Inkscape::Selection *selection);
    void checkbox_toggled(Gtk::ToggleButton   *tb,
                          Glib::ustring const &attr);
    void do_pick_toggled();
    void external_change();
    void fill_width_changed();
    void fill_height_changed();
    void keep_bbox_toggled();
    void on_remove_button_clicked() {remove();}
    void pick_switched(PickType);
    void pick_to(Gtk::ToggleButton   *tb,
                 Glib::ustring const &pref);
    void remove(bool do_undo = true);
    void reset();
    void reset_recursive(Gtk::Widget *w);
    void switch_to_create();
    void switch_to_fill();
    void unclump();
    void unit_changed();
    void value_changed(Glib::RefPtr<Gtk::Adjustment> &adj, Glib::ustring const &pref);
    void xy_changed(Glib::RefPtr<Gtk::Adjustment> &adj, Glib::ustring const &pref);

    Geom::Affine get_transform(
            // symmetry group
            int type,

            // row, column
            int i, int j,

            // center, width, height of the tile
            double cx, double cy,
            double w,  double h,

            // values from the dialog:
            // Shift
            double shiftx_per_i,      double shifty_per_i,
            double shiftx_per_j,      double shifty_per_j,
            double shiftx_rand,       double shifty_rand,
            double shiftx_exp,        double shifty_exp,
            int    shiftx_alternate,  int    shifty_alternate,
            int    shiftx_cumulate,   int    shifty_cumulate,
            int    shiftx_excludew,   int    shifty_excludeh,

            // Scale
            double scalex_per_i,      double scaley_per_i,
            double scalex_per_j,      double scaley_per_j,
            double scalex_rand,       double scaley_rand,
            double scalex_exp,        double scaley_exp,
            double scalex_log,        double scaley_log,
            int    scalex_alternate,  int    scaley_alternate,
            int    scalex_cumulate,   int    scaley_cumulate,

            // Rotation
            double rotate_per_i,      double rotate_per_j,
            double rotate_rand,
            int    rotate_alternatei, int    rotate_alternatej,
            int    rotate_cumulatei,  int    rotate_cumulatej
            );


private:
    CloneTiler(CloneTiler const &d) = delete;
    CloneTiler& operator=(CloneTiler const &d) = delete;

    UI::Widget::CheckButtonInternal *_b;
    UI::Widget::CheckButtonInternal *_cb_keep_bbox;
    Gtk::Notebook *nb = nullptr;
    Inkscape::UI::Widget::ColorPicker *color_picker;
    Glib::RefPtr<Gtk::SizeGroup> table_row_labels;
    Inkscape::UI::Widget::UnitMenu *unit_menu;

    Glib::RefPtr<Gtk::Adjustment> fill_width;
    Glib::RefPtr<Gtk::Adjustment> fill_height;

    sigc::connection selectChangedConn;
    sigc::connection externChangedConn;
    sigc::connection color_changed_connection;
    sigc::connection unitChangedConn;

    // Variables that used to be set using GObject
    Gtk::Box *_buttons_on_tiles;
    Gtk::Box *_dotrace;
    Gtk::Label *_status;
    std::vector<Gtk::Widget*> _rowscols;
    std::vector<Gtk::Widget*> _widthheight;
};

enum {
    TILE_P1,
    TILE_P2,
    TILE_PM,
    TILE_PG,
    TILE_CM,
    TILE_PMM,
    TILE_PMG,
    TILE_PGG,
    TILE_CMM,
    TILE_P4,
    TILE_P4M,
    TILE_P4G,
    TILE_P3,
    TILE_P31M,
    TILE_P3M1,
    TILE_P6,
    TILE_P6M
};

} // namespace Dialog
} // namespace UI
} // 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:fileencoding=utf-8:textwidth=99 :