3 #include <glibmm/i18n.h>
5 #include "swatch-selector.h"
7 #include "document.h"
8 #include "gradient-chemistry.h"
9 #include "gradient-selector.h"
10 #include "sp-color-notebook.h"
11 #include "sp-stop.h"
12 #include "svg/css-ostringstream.h"
13 #include "svg/svg-color.h"
14 #include "verbs.h"
15 #include "xml/node.h"
17 namespace Inkscape
18 {
19 namespace Widgets
20 {
22 SwatchSelector::SwatchSelector() :
23 Gtk::VBox(),
24 _gsel(0),
25 _csel(0)
26 {
27 GtkWidget *gsel = sp_gradient_selector_new();
28 _gsel = SP_GRADIENT_SELECTOR(gsel);
29 g_object_set_data( G_OBJECT(gobj()), "base", this );
30 _gsel->setMode(SPGradientSelector::MODE_SWATCH);
32 gtk_widget_show(gsel);
34 pack_start(*Gtk::manage(Glib::wrap(gsel)));
37 GtkWidget *csel = sp_color_selector_new( SP_TYPE_COLOR_NOTEBOOK );
38 _csel = SP_COLOR_SELECTOR(csel);
39 Gtk::Widget *wrappedCSel = Glib::wrap(csel);
40 wrappedCSel->show();
41 //gtk_widget_show(csel);
44 GObject *obj = G_OBJECT(csel);
46 g_signal_connect(obj, "grabbed", G_CALLBACK(_grabbedCb), this);
47 g_signal_connect(obj, "dragged", G_CALLBACK(_draggedCb), this);
48 g_signal_connect(obj, "released", G_CALLBACK(_releasedCb), this);
49 g_signal_connect(obj, "changed", G_CALLBACK(_changedCb), this);
51 pack_start(*Gtk::manage(wrappedCSel));
52 }
54 SwatchSelector::~SwatchSelector()
55 {
56 _csel = 0; // dtor should be handled by Gtk::manage()
57 _gsel = 0;
58 }
60 void SwatchSelector::_grabbedCb(SPColorSelector * /*csel*/, void * /*data*/)
61 {
62 }
64 void SwatchSelector::_draggedCb(SPColorSelector * /*csel*/, void *data)
65 {
66 if (data) {
67 //SwatchSelector *swsel = reinterpret_cast<SwatchSelector*>(data);
69 // TODO might have to block cycles
71 // Copied from gradient-vector.cpp, but does not appear to cause visible changes:
72 /*
73 if (swsel->_gsel) {
74 SPGradient *gradient = swsel->_gsel->getVector();
75 SPGradient *ngr = sp_gradient_ensure_vector_normalized(gradient);
76 if (ngr != gradient) {
77 // Our master gradient has changed
78 // TODO replace with proper - sp_gradient_vector_widget_load_gradient(GTK_WIDGET(swsel->_gsel), ngr);
79 }
81 sp_gradient_ensure_vector(ngr);
84 SPStop* stop = ngr->getFirstStop();
85 if (stop) {
86 swsel->_csel->base->getColorAlpha(stop->specified_color, &stop->opacity);
87 stop->currentColor = false;
88 // TODO push refresh
89 }
90 }
91 */
92 }
93 }
95 void SwatchSelector::_releasedCb(SPColorSelector * /*csel*/, void * /*data*/)
96 {
97 }
99 void SwatchSelector::_changedCb(SPColorSelector */*csel*/, void *data)
100 {
101 if (data) {
102 SwatchSelector *swsel = reinterpret_cast<SwatchSelector*>(data);
104 // TODO might have to block cycles
106 if (swsel->_gsel) {
107 SPGradient *gradient = swsel->_gsel->getVector();
108 SPGradient *ngr = sp_gradient_ensure_vector_normalized(gradient);
109 if (ngr != gradient) {
110 /* Our master gradient has changed */
111 // TODO replace with proper - sp_gradient_vector_widget_load_gradient(GTK_WIDGET(swsel->_gsel), ngr);
112 }
114 sp_gradient_ensure_vector(ngr);
117 SPStop* stop = ngr->getFirstStop();
118 if (stop) {
119 SPColor color;
120 float alpha = 0;
121 guint32 rgb = 0;
123 swsel->_csel->base->getColorAlpha( color, &alpha );
124 rgb = color.toRGBA32( 0x00 );
126 // TODO replace with generic shared code that also handles icc-color
127 Inkscape::CSSOStringStream os;
128 gchar c[64];
129 sp_svg_write_color(c, sizeof(c), rgb);
130 os << "stop-color:" << c << ";stop-opacity:" << static_cast<gdouble>(alpha) <<";";
131 SP_OBJECT_REPR(stop)->setAttribute("style", os.str().c_str());
133 sp_document_done(SP_OBJECT_DOCUMENT(ngr), SP_VERB_CONTEXT_GRADIENT,
134 _("Change swatch color"));
135 }
136 }
137 }
138 }
140 void SwatchSelector::connectGrabbedHandler( GCallback handler, void *data )
141 {
142 GObject* obj = G_OBJECT(_gsel);
143 g_signal_connect( obj, "grabbed", handler, data );
144 }
146 void SwatchSelector::connectDraggedHandler( GCallback handler, void *data )
147 {
148 GObject* obj = G_OBJECT(_gsel);
149 g_signal_connect( obj, "dragged", handler, data );
150 }
152 void SwatchSelector::connectReleasedHandler( GCallback handler, void *data )
153 {
154 GObject* obj = G_OBJECT(_gsel);
155 g_signal_connect( obj, "released", handler, data );
156 }
158 void SwatchSelector::connectchangedHandler( GCallback handler, void *data )
159 {
160 GObject* obj = G_OBJECT(_gsel);
161 g_signal_connect( obj, "changed", handler, data );
162 }
164 void SwatchSelector::setVector(SPDocument */*doc*/, SPGradient *vector)
165 {
166 //GtkVBox * box = gobj();
168 _gsel->setVector((vector) ? SP_OBJECT_DOCUMENT(vector) : 0, vector);
170 if (vector) {
171 SPStop* stop = vector->getFirstStop();
173 guint32 const colorVal = sp_stop_get_rgba32(stop);
174 _csel->base->setAlpha(SP_RGBA32_A_F(colorVal));
175 SPColor color( SP_RGBA32_R_F(colorVal), SP_RGBA32_G_F(colorVal), SP_RGBA32_B_F(colorVal) );
176 // set its color, from the stored array
177 _csel->base->setColor( color );
178 }
180 /*
181 */
182 }
184 } // namespace Widgets
185 } // namespace Inkscape
189 /*
190 Local Variables:
191 mode:c++
192 c-file-style:"stroustrup"
193 c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
194 indent-tabs-mode:nil
195 fill-column:99
196 End:
197 */
198 // vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=99 :