Code

Merge and cleanup of GSoC C++-ification project.
[inkscape.git] / src / widgets / swatch-selector.cpp
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 SPGradientSelector *SwatchSelector::getGradientSelector()
61 {
62     return _gsel;
63 }
65 void SwatchSelector::_grabbedCb(SPColorSelector * /*csel*/, void * /*data*/)
66 {
67 }
69 void SwatchSelector::_draggedCb(SPColorSelector * /*csel*/, void *data)
70 {
71     if (data) {
72         //SwatchSelector *swsel = reinterpret_cast<SwatchSelector*>(data);
74         // TODO might have to block cycles
76         // Copied from gradient-vector.cpp, but does not appear to cause visible changes:
77         /*
78         if (swsel->_gsel) {
79             SPGradient *gradient = swsel->_gsel->getVector();
80             SPGradient *ngr = sp_gradient_ensure_vector_normalized(gradient);
81             if (ngr != gradient) {
82                 // Our master gradient has changed
83                 // TODO replace with proper - sp_gradient_vector_widget_load_gradient(GTK_WIDGET(swsel->_gsel), ngr);
84             }
86             sp_gradient_ensure_vector(ngr);
89             SPStop* stop = ngr->getFirstStop();
90             if (stop) {
91                 swsel->_csel->base->getColorAlpha(stop->specified_color, &stop->opacity);
92                 stop->currentColor = false;
93                 // TODO push refresh
94             }
95         }
96         */
97     }
98 }
100 void SwatchSelector::_releasedCb(SPColorSelector * /*csel*/, void * /*data*/)
104 void SwatchSelector::_changedCb(SPColorSelector */*csel*/, void *data)
106     if (data) {
107         SwatchSelector *swsel = reinterpret_cast<SwatchSelector*>(data);
109         // TODO might have to block cycles
111         if (swsel->_gsel && swsel->_gsel->getVector()) {
112             SPGradient *gradient = swsel->_gsel->getVector();
113             SPGradient *ngr = sp_gradient_ensure_vector_normalized(gradient);
114             if (ngr != gradient) {
115                 /* Our master gradient has changed */
116                 // TODO replace with proper - sp_gradient_vector_widget_load_gradient(GTK_WIDGET(swsel->_gsel), ngr);
117             }
119             ngr->ensureVector();
122             SPStop* stop = ngr->getFirstStop();
123             if (stop) {
124                 SPColor color;
125                 float alpha = 0;
126                 guint32 rgb = 0;
128                 swsel->_csel->base->getColorAlpha( color, alpha );
129                 rgb = color.toRGBA32( 0x00 );
131                 // TODO replace with generic shared code that also handles icc-color
132                 Inkscape::CSSOStringStream os;
133                 gchar c[64];
134                 sp_svg_write_color(c, sizeof(c), rgb);
135                 os << "stop-color:" << c << ";stop-opacity:" << static_cast<gdouble>(alpha) <<";";
136                 SP_OBJECT_REPR(stop)->setAttribute("style", os.str().c_str());
138                 DocumentUndo::done(SP_OBJECT_DOCUMENT(ngr), SP_VERB_CONTEXT_GRADIENT,
139                                    _("Change swatch color"));
140             }
141         }
142     }
145 void SwatchSelector::connectGrabbedHandler( GCallback handler, void *data )
147     GObject* obj = G_OBJECT(_gsel);
148     g_signal_connect( obj, "grabbed", handler, data );
151 void SwatchSelector::connectDraggedHandler( GCallback handler, void *data )
153     GObject* obj = G_OBJECT(_gsel);
154     g_signal_connect( obj, "dragged", handler, data );
157 void SwatchSelector::connectReleasedHandler( GCallback handler, void *data )
159     GObject* obj = G_OBJECT(_gsel);
160     g_signal_connect( obj, "released", handler, data );
163 void SwatchSelector::connectchangedHandler( GCallback handler, void *data )
165     GObject* obj = G_OBJECT(_gsel);
166     g_signal_connect( obj, "changed", handler, data );
169 void SwatchSelector::setVector(SPDocument */*doc*/, SPGradient *vector)
171     //GtkVBox * box = gobj();
172     _gsel->setVector((vector) ? SP_OBJECT_DOCUMENT(vector) : 0, vector);
174     if ( vector && vector->isSolid() ) {
175         SPStop* stop = vector->getFirstStop();
177         guint32 const colorVal = sp_stop_get_rgba32(stop);
178         _csel->base->setAlpha(SP_RGBA32_A_F(colorVal));
179         SPColor color( SP_RGBA32_R_F(colorVal), SP_RGBA32_G_F(colorVal), SP_RGBA32_B_F(colorVal) );
180         // set its color, from the stored array
181         _csel->base->setColor( color );
182         gtk_widget_show_all( GTK_WIDGET(_csel) );
183     } else {
184         gtk_widget_hide( GTK_WIDGET(_csel) );
185     }
187 /*
188 */
191 } // namespace Widgets
192 } // namespace Inkscape
196 /*
197   Local Variables:
198   mode:c++
199   c-file-style:"stroustrup"
200   c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
201   indent-tabs-mode:nil
202   fill-column:99
203   End:
204 */
205 // vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :