summaryrefslogtreecommitdiffstats
path: root/src/ui/dialog/clonetiler.h
blob: 2cad30e9ed9f33cc1425bf6ba6e10b7eda813de5 (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
/** @file
 * @brief Clone tiling dialog
 */
/* Authors:
 *   bulia byak <buliabyak@users.sf.net>
 *
 * Copyright (C) 2004 Authors
 * Released under the GNU GPL, read the file 'COPYING' for more information
 */
#ifndef __SP_CLONE_TILER_H__
#define __SP_CLONE_TILER_H__

#include "ui/widget/panel.h"
#include <glib.h>
#include <gtk/gtk.h>

#include "ui/dialog/desktop-tracker.h"
#include "ui/widget/color-picker.h"
#include "sp-root.h"

namespace Inkscape {
namespace UI {
namespace Dialog {

class CloneTiler : public Widget::Panel {
public:
    CloneTiler();
    virtual ~CloneTiler();

    static CloneTiler &getInstance() { return *new CloneTiler(); }

protected:

    GtkWidget * clonetiler_new_tab(GtkWidget *nb, const gchar *label);
    GtkWidget * clonetiler_table_x_y_rand(int values);
    GtkWidget * clonetiler_spinbox(const char *tip, const char *attr, double lower, double upper, const gchar *suffix, bool exponent = false);
    GtkWidget * clonetiler_checkbox(const char *tip, const char *attr);
    void clonetiler_table_attach(GtkWidget *table, GtkWidget *widget, float align, int row, int col);

    static void clonetiler_symgroup_changed(GtkComboBox *cb, gpointer /*data*/);
    static void clonetiler_remove(GtkWidget */*widget*/, GtkWidget *dlg, bool do_undo = true);
    static void on_picker_color_changed(guint rgba);
    static void clonetiler_trace_hide_tiled_clones_recursively(SPObject *from);
    static void clonetiler_checkbox_toggled(GtkToggleButton *tb, gpointer *data);
    static void clonetiler_pick_switched(GtkToggleButton */*tb*/, gpointer data);
    static void clonetiler_do_pick_toggled(GtkToggleButton *tb, GtkWidget *dlg);
    static void clonetiler_pick_to(GtkToggleButton *tb, gpointer data);
    static void clonetiler_xy_changed(GtkAdjustment *adj, gpointer data);
    static void clonetiler_fill_width_changed(GtkAdjustment *adj, GtkWidget *u);
    static void clonetiler_fill_height_changed(GtkAdjustment *adj, GtkWidget *u);
    static void clonetiler_switch_to_create(GtkToggleButton */*tb*/, GtkWidget *dlg);
    static void clonetiler_switch_to_fill(GtkToggleButton */*tb*/, GtkWidget *dlg);
    static void clonetiler_keep_bbox_toggled(GtkToggleButton *tb, gpointer /*data*/);
    static void clonetiler_apply(GtkWidget */*widget*/, GtkWidget *dlg);
    static void clonetiler_unclump(GtkWidget */*widget*/, void *);
    static void clonetiler_change_selection(Inkscape::Application * /*inkscape*/, Inkscape::Selection *selection, GtkWidget *dlg);
    static void clonetiler_external_change(Inkscape::Application * /*inkscape*/, GtkWidget *dlg);
    static void clonetiler_disconnect_gsignal(GObject *widget, gpointer source);
    static void clonetiler_reset(GtkWidget */*widget*/, GtkWidget *dlg);
    static guint clonetiler_number_of_clones(SPObject *obj);
    static void clonetiler_trace_setup(SPDocument *doc, gdouble zoom, SPItem *original);
    static guint32 clonetiler_trace_pick(Geom::Rect box);
    static void clonetiler_trace_finish();
    static bool clonetiler_is_a_clone_of(SPObject *tile, SPObject *obj);
    static Geom::Rect transform_rect(Geom::Rect const &r, Geom::Affine const &m);
    static double randomize01(double val, double rand);
    static void clonetiler_value_changed(GtkAdjustment *adj, gpointer data);
    static void clonetiler_reset_recursive(GtkWidget *w);

    static Geom::Affine clonetiler_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);
    CloneTiler& operator=(CloneTiler const &d);

    GtkWidget *dlg;
    SPDesktop *desktop;
    DesktopTracker deskTrack;
    Inkscape::UI::Widget::ColorPicker *color_picker;
    GtkSizeGroup* table_row_labels;

    sigc::connection desktopChangeConn;
    sigc::connection selectChangedConn;
    sigc::connection subselChangedConn;
    sigc::connection selectModifiedConn;
    sigc::connection color_changed_connection;

    /**
     * Can be invoked for setting the desktop. Currently not used.
     */
    void setDesktop(SPDesktop *desktop);

    /**
     * Is invoked by the desktop tracker when the desktop changes.
     */
    void setTargetDesktop(SPDesktop *desktop);

};


enum {
    PICK_COLOR,
    PICK_OPACITY,
    PICK_R,
    PICK_G,
    PICK_B,
    PICK_H,
    PICK_S,
    PICK_L
};

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 :