62
60
static GtkVBoxClass *parent_class;
63
61
static guint signals[LAST_SIGNAL] = {0};
63
// TODO FIXME kill these globals!!!
65
64
static GtkWidget *dlg = NULL;
66
65
static win_data wd;
67
66
static gint x = -1000, y = -1000, w = 0, h = 0; // impossible original values to make sure they are read from prefs
68
static gchar const *prefs_path = "dialogs.gradienteditor";
67
static Glib::ustring const prefs_path = "/dialogs/gradienteditor/";
71
sp_gradient_vector_selector_get_type (void)
69
GType sp_gradient_vector_selector_get_type(void)
73
static GtkType type = 0;
76
"SPGradientVectorSelector",
77
sizeof (SPGradientVectorSelector),
78
sizeof (SPGradientVectorSelectorClass),
79
(GtkClassInitFunc) sp_gradient_vector_selector_class_init,
80
(GtkObjectInitFunc) sp_gradient_vector_selector_init,
83
type = gtk_type_unique (GTK_TYPE_VBOX, &info);
71
static GType type = 0;
73
static const GTypeInfo info = {
74
sizeof(SPGradientVectorSelectorClass),
76
NULL, /* base_finalize */
77
(GClassInitFunc) sp_gradient_vector_selector_class_init,
78
NULL, /* class_finalize */
79
NULL, /* class_data */
80
sizeof(SPGradientVectorSelector),
82
(GInstanceInitFunc) sp_gradient_vector_selector_init,
86
type = g_type_register_static( GTK_TYPE_VBOX,
87
"SPGradientVectorSelector",
89
static_cast< GTypeFlags > (0) );
89
95
sp_gradient_vector_selector_class_init (SPGradientVectorSelectorClass *klass)
91
GtkObjectClass *object_class;
93
object_class = GTK_OBJECT_CLASS (klass);
95
parent_class = (GtkVBoxClass*)gtk_type_class (GTK_TYPE_VBOX);
97
signals[VECTOR_SET] = gtk_signal_new ("vector_set",
99
GTK_CLASS_TYPE(object_class),
100
GTK_SIGNAL_OFFSET (SPGradientVectorSelectorClass, vector_set),
101
gtk_marshal_NONE__POINTER,
105
object_class->destroy = sp_gradient_vector_selector_destroy;
97
GtkObjectClass *object_class;
99
object_class = GTK_OBJECT_CLASS (klass);
101
parent_class = (GtkVBoxClass*)gtk_type_class (GTK_TYPE_VBOX);
103
signals[VECTOR_SET] = gtk_signal_new ("vector_set",
105
GTK_CLASS_TYPE(object_class),
106
GTK_SIGNAL_OFFSET (SPGradientVectorSelectorClass, vector_set),
107
gtk_marshal_NONE__POINTER,
111
object_class->destroy = sp_gradient_vector_selector_destroy;
109
115
sp_gradient_vector_selector_init (SPGradientVectorSelector *gvs)
116
new (&gvs->gradient_release_connection) sigc::connection();
117
new (&gvs->defs_release_connection) sigc::connection();
118
new (&gvs->defs_modified_connection) sigc::connection();
120
gvs->menu = gtk_option_menu_new ();
121
gtk_widget_show (gvs->menu);
122
gtk_box_pack_start (GTK_BOX (gvs), gvs->menu, TRUE, TRUE, 0);
122
new (&gvs->gradient_release_connection) sigc::connection();
123
new (&gvs->defs_release_connection) sigc::connection();
124
new (&gvs->defs_modified_connection) sigc::connection();
126
gvs->menu = gtk_option_menu_new ();
127
gtk_widget_show (gvs->menu);
128
gtk_box_pack_start (GTK_BOX (gvs), gvs->menu, TRUE, TRUE, 0);
126
132
sp_gradient_vector_selector_destroy (GtkObject *object)
128
SPGradientVectorSelector *gvs;
130
gvs = SP_GRADIENT_VECTOR_SELECTOR (object);
133
gvs->gradient_release_connection.disconnect();
138
gvs->defs_release_connection.disconnect();
139
gvs->defs_modified_connection.disconnect();
143
gvs->gradient_release_connection.~connection();
144
gvs->defs_release_connection.~connection();
145
gvs->defs_modified_connection.~connection();
147
if (((GtkObjectClass *) (parent_class))->destroy)
148
(* ((GtkObjectClass *) (parent_class))->destroy) (object);
134
SPGradientVectorSelector *gvs;
136
gvs = SP_GRADIENT_VECTOR_SELECTOR (object);
139
gvs->gradient_release_connection.disconnect();
144
gvs->defs_release_connection.disconnect();
145
gvs->defs_modified_connection.disconnect();
149
gvs->gradient_release_connection.~connection();
150
gvs->defs_release_connection.~connection();
151
gvs->defs_modified_connection.~connection();
153
if (((GtkObjectClass *) (parent_class))->destroy)
154
(* ((GtkObjectClass *) (parent_class))->destroy) (object);
152
158
sp_gradient_vector_selector_new (SPDocument *doc, SPGradient *gr)
156
g_return_val_if_fail (!gr || SP_IS_GRADIENT (gr), NULL);
157
g_return_val_if_fail (!gr || (SP_OBJECT_DOCUMENT (gr) == doc), NULL);
159
gvs = (GtkWidget*)gtk_type_new (SP_TYPE_GRADIENT_VECTOR_SELECTOR);
162
sp_gradient_vector_selector_set_gradient (SP_GRADIENT_VECTOR_SELECTOR (gvs), doc, gr);
164
sp_gvs_rebuild_gui_full (SP_GRADIENT_VECTOR_SELECTOR (gvs));
162
g_return_val_if_fail (!gr || SP_IS_GRADIENT (gr), NULL);
163
g_return_val_if_fail (!gr || (SP_OBJECT_DOCUMENT (gr) == doc), NULL);
165
gvs = (GtkWidget*)gtk_type_new (SP_TYPE_GRADIENT_VECTOR_SELECTOR);
168
sp_gradient_vector_selector_set_gradient (SP_GRADIENT_VECTOR_SELECTOR (gvs), doc, gr);
170
sp_gvs_rebuild_gui_full (SP_GRADIENT_VECTOR_SELECTOR (gvs));
171
177
sp_gradient_vector_selector_set_gradient (SPGradientVectorSelector *gvs, SPDocument *doc, SPGradient *gr)
173
static gboolean suppress = FALSE;
175
g_return_if_fail (gvs != NULL);
176
g_return_if_fail (SP_IS_GRADIENT_VECTOR_SELECTOR (gvs));
177
g_return_if_fail (!gr || (doc != NULL));
178
g_return_if_fail (!gr || SP_IS_GRADIENT (gr));
179
g_return_if_fail (!gr || (SP_OBJECT_DOCUMENT (gr) == doc));
180
g_return_if_fail (!gr || SP_GRADIENT_HAS_STOPS (gr));
182
if (doc != gvs->doc) {
183
/* Disconnect signals */
185
gvs->gradient_release_connection.disconnect();
189
gvs->defs_release_connection.disconnect();
190
gvs->defs_modified_connection.disconnect();
193
/* Connect signals */
195
gvs->defs_release_connection = SP_DOCUMENT_DEFS(doc)->connectRelease(sigc::bind<1>(sigc::ptr_fun(&sp_gvs_defs_release), gvs));
196
gvs->defs_modified_connection = SP_DOCUMENT_DEFS(doc)->connectModified(sigc::bind<2>(sigc::ptr_fun(&sp_gvs_defs_modified), gvs));
199
gvs->gradient_release_connection = gr->connectRelease(sigc::bind<1>(sigc::ptr_fun(&sp_gvs_gradient_release), gvs));
203
sp_gvs_rebuild_gui_full (gvs);
204
if (!suppress) g_signal_emit (G_OBJECT (gvs), signals[VECTOR_SET], 0, gr);
205
} else if (gr != gvs->gr) {
206
/* Harder case - keep document, rebuild menus and stuff */
207
/* fixme: (Lauris) */
209
sp_gradient_vector_selector_set_gradient (gvs, NULL, NULL);
210
sp_gradient_vector_selector_set_gradient (gvs, doc, gr);
212
g_signal_emit (G_OBJECT (gvs), signals[VECTOR_SET], 0, gr);
214
/* The case of setting NULL -> NULL is not very interesting */
179
static gboolean suppress = FALSE;
181
g_return_if_fail (gvs != NULL);
182
g_return_if_fail (SP_IS_GRADIENT_VECTOR_SELECTOR (gvs));
183
g_return_if_fail (!gr || (doc != NULL));
184
g_return_if_fail (!gr || SP_IS_GRADIENT (gr));
185
g_return_if_fail (!gr || (SP_OBJECT_DOCUMENT (gr) == doc));
186
g_return_if_fail (!gr || SP_GRADIENT_HAS_STOPS (gr));
188
if (doc != gvs->doc) {
189
/* Disconnect signals */
191
gvs->gradient_release_connection.disconnect();
195
gvs->defs_release_connection.disconnect();
196
gvs->defs_modified_connection.disconnect();
199
/* Connect signals */
201
gvs->defs_release_connection = SP_DOCUMENT_DEFS(doc)->connectRelease(sigc::bind<1>(sigc::ptr_fun(&sp_gvs_defs_release), gvs));
202
gvs->defs_modified_connection = SP_DOCUMENT_DEFS(doc)->connectModified(sigc::bind<2>(sigc::ptr_fun(&sp_gvs_defs_modified), gvs));
205
gvs->gradient_release_connection = gr->connectRelease(sigc::bind<1>(sigc::ptr_fun(&sp_gvs_gradient_release), gvs));
209
sp_gvs_rebuild_gui_full (gvs);
210
if (!suppress) g_signal_emit (G_OBJECT (gvs), signals[VECTOR_SET], 0, gr);
211
} else if (gr != gvs->gr) {
212
/* Harder case - keep document, rebuild menus and stuff */
213
/* fixme: (Lauris) */
215
sp_gradient_vector_selector_set_gradient (gvs, NULL, NULL);
216
sp_gradient_vector_selector_set_gradient (gvs, doc, gr);
218
g_signal_emit (G_OBJECT (gvs), signals[VECTOR_SET], 0, gr);
220
/* The case of setting NULL -> NULL is not very interesting */
218
224
sp_gradient_vector_selector_get_document (SPGradientVectorSelector *gvs)
220
g_return_val_if_fail (gvs != NULL, NULL);
221
g_return_val_if_fail (SP_IS_GRADIENT_VECTOR_SELECTOR (gvs), NULL);
226
g_return_val_if_fail (gvs != NULL, NULL);
227
g_return_val_if_fail (SP_IS_GRADIENT_VECTOR_SELECTOR (gvs), NULL);
227
233
sp_gradient_vector_selector_get_gradient (SPGradientVectorSelector *gvs)
229
g_return_val_if_fail (gvs != NULL, NULL);
230
g_return_val_if_fail (SP_IS_GRADIENT_VECTOR_SELECTOR (gvs), NULL);
235
g_return_val_if_fail (gvs != NULL, NULL);
236
g_return_val_if_fail (SP_IS_GRADIENT_VECTOR_SELECTOR (gvs), NULL);
236
242
sp_gvs_rebuild_gui_full (SPGradientVectorSelector *gvs)
238
/* Clear old menu, if there is any */
239
if (gtk_option_menu_get_menu (GTK_OPTION_MENU (gvs->menu))) {
240
gtk_option_menu_remove_menu (GTK_OPTION_MENU (gvs->menu));
243
/* Create new menu widget */
244
GtkWidget *m = gtk_menu_new ();
247
/* Pick up all gradients with vectors */
250
const GSList *gradients = sp_document_get_resource_list (SP_OBJECT_DOCUMENT (gvs->gr), "gradient");
251
for (const GSList *l = gradients; l != NULL; l = l->next) {
252
if (SP_GRADIENT_HAS_STOPS (l->data)) {
253
gl = g_slist_prepend (gl, l->data);
257
gl = g_slist_reverse (gl);
264
i = gtk_menu_item_new_with_label (_("No document selected"));
266
gtk_menu_append (GTK_MENU (m), i);
267
gtk_widget_set_sensitive (gvs->menu, FALSE);
270
i = gtk_menu_item_new_with_label (_("No gradients in document"));
272
gtk_menu_append (GTK_MENU (m), i);
273
gtk_widget_set_sensitive (gvs->menu, FALSE);
274
} else if (!gvs->gr) {
276
i = gtk_menu_item_new_with_label (_("No gradient selected"));
278
gtk_menu_append (GTK_MENU (m), i);
279
gtk_widget_set_sensitive (gvs->menu, FALSE);
284
gr = SP_GRADIENT (gl->data);
285
gl = g_slist_remove (gl, gr);
287
/* We have to know: */
288
/* Gradient destroy */
289
/* Gradient name change */
290
i = gtk_menu_item_new ();
292
g_object_set_data (G_OBJECT (i), "gradient", gr);
293
g_signal_connect (G_OBJECT (i), "activate", G_CALLBACK (sp_gvs_gradient_activate), gvs);
295
w = sp_gradient_image_new (gr);
300
hb = gtk_hbox_new (FALSE, 4);
301
gtk_widget_show (hb);
302
l = gtk_label_new (SP_OBJECT_ID (gr));
304
gtk_misc_set_alignment (GTK_MISC (l), 1.0, 0.5);
305
gtk_box_pack_start (GTK_BOX (hb), l, TRUE, TRUE, 0);
306
gtk_box_pack_start (GTK_BOX (hb), w, FALSE, FALSE, 0);
310
gtk_container_add (GTK_CONTAINER (i), w);
312
gtk_menu_append (GTK_MENU (m), i);
314
if (gr == gvs->gr) pos = idx;
317
gtk_widget_set_sensitive (gvs->menu, TRUE);
320
gtk_option_menu_set_menu (GTK_OPTION_MENU (gvs->menu), m);
322
gtk_option_menu_set_history (GTK_OPTION_MENU (gvs->menu), pos);
244
/* Clear old menu, if there is any */
245
if (gtk_option_menu_get_menu (GTK_OPTION_MENU (gvs->menu))) {
246
gtk_option_menu_remove_menu (GTK_OPTION_MENU (gvs->menu));
249
/* Create new menu widget */
250
GtkWidget *m = gtk_menu_new ();
253
/* Pick up all gradients with vectors */
256
const GSList *gradients = sp_document_get_resource_list (SP_OBJECT_DOCUMENT (gvs->gr), "gradient");
257
for (const GSList *l = gradients; l != NULL; l = l->next) {
258
if (SP_GRADIENT_HAS_STOPS (l->data)) {
259
gl = g_slist_prepend (gl, l->data);
263
gl = g_slist_reverse (gl);
270
i = gtk_menu_item_new_with_label (_("No document selected"));
272
gtk_menu_append (GTK_MENU (m), i);
273
gtk_widget_set_sensitive (gvs->menu, FALSE);
276
i = gtk_menu_item_new_with_label (_("No gradients in document"));
278
gtk_menu_append (GTK_MENU (m), i);
279
gtk_widget_set_sensitive (gvs->menu, FALSE);
280
} else if (!gvs->gr) {
282
i = gtk_menu_item_new_with_label (_("No gradient selected"));
284
gtk_menu_append (GTK_MENU (m), i);
285
gtk_widget_set_sensitive (gvs->menu, FALSE);
290
gr = SP_GRADIENT (gl->data);
291
gl = g_slist_remove (gl, gr);
293
/* We have to know: */
294
/* Gradient destroy */
295
/* Gradient name change */
296
i = gtk_menu_item_new ();
298
g_object_set_data (G_OBJECT (i), "gradient", gr);
299
g_signal_connect (G_OBJECT (i), "activate", G_CALLBACK (sp_gvs_gradient_activate), gvs);
301
w = sp_gradient_image_new (gr);
306
hb = gtk_hbox_new (FALSE, 4);
307
gtk_widget_show (hb);
308
l = gtk_label_new (SP_OBJECT_ID (gr));
310
gtk_misc_set_alignment (GTK_MISC (l), 1.0, 0.5);
311
gtk_box_pack_start (GTK_BOX (hb), l, TRUE, TRUE, 0);
312
gtk_box_pack_start (GTK_BOX (hb), w, FALSE, FALSE, 0);
316
gtk_container_add (GTK_CONTAINER (i), w);
318
gtk_menu_append (GTK_MENU (m), i);
320
if (gr == gvs->gr) pos = idx;
323
gtk_widget_set_sensitive (gvs->menu, TRUE);
326
gtk_option_menu_set_menu (GTK_OPTION_MENU (gvs->menu), m);
328
gtk_option_menu_set_history (GTK_OPTION_MENU (gvs->menu), pos);
326
332
sp_gvs_gradient_activate (GtkMenuItem *mi, SPGradientVectorSelector *gvs)
328
SPGradient *gr, *norm;
330
gr = (SPGradient*)g_object_get_data (G_OBJECT (mi), "gradient");
331
/* Hmmm... bad things may happen here, if actual gradient is something new */
332
/* Namely - menuitems etc. will be fucked up */
333
/* Hmmm - probably we can just re-set it as menuitem data (Lauris) */
335
//g_print ("SPGradientVectorSelector: gradient %s activated\n", SP_OBJECT_ID (gr));
337
norm = sp_gradient_ensure_vector_normalized (gr);
339
//g_print ("SPGradientVectorSelector: become %s after normalization\n", SP_OBJECT_ID (norm));
340
/* But be careful that we do not have gradient saved anywhere else */
341
g_object_set_data (G_OBJECT (mi), "gradient", norm);
344
/* fixme: Really we would want to use _set_vector */
347
gvs->gradient_release_connection.disconnect();
352
gvs->gradient_release_connection = norm->connectRelease(sigc::bind<1>(sigc::ptr_fun(&sp_gvs_gradient_release), gvs));
356
g_signal_emit (G_OBJECT (gvs), signals[VECTOR_SET], 0, norm);
359
/* We do extra undo push here */
360
/* If handler has already done it, it is just NOP */
361
// FIXME: looks like this is never a valid undo step, consider removing this
362
sp_document_done (SP_OBJECT_DOCUMENT (norm), SP_VERB_CONTEXT_GRADIENT,
363
/* TODO: annotate */ "gradient-vector.cpp:350");
368
sp_gvs_gradient_release (SPObject *obj, SPGradientVectorSelector *gvs)
370
/* Disconnect gradient */
372
gvs->gradient_release_connection.disconnect();
377
sp_gvs_rebuild_gui_full (gvs);
381
sp_gvs_defs_release (SPObject *defs, SPGradientVectorSelector *gvs)
385
gvs->defs_release_connection.disconnect();
386
gvs->defs_modified_connection.disconnect();
388
/* Disconnect gradient as well */
390
gvs->gradient_release_connection.disconnect();
395
sp_gvs_rebuild_gui_full (gvs);
399
sp_gvs_defs_modified (SPObject *defs, guint flags, SPGradientVectorSelector *gvs)
401
/* fixme: We probably have to check some flags here (Lauris) */
403
sp_gvs_rebuild_gui_full (gvs);
334
SPGradient *gr, *norm;
336
gr = (SPGradient*)g_object_get_data (G_OBJECT (mi), "gradient");
337
/* Hmmm... bad things may happen here, if actual gradient is something new */
338
/* Namely - menuitems etc. will be fucked up */
339
/* Hmmm - probably we can just re-set it as menuitem data (Lauris) */
341
//g_print ("SPGradientVectorSelector: gradient %s activated\n", SP_OBJECT_ID (gr));
343
norm = sp_gradient_ensure_vector_normalized (gr);
345
//g_print ("SPGradientVectorSelector: become %s after normalization\n", SP_OBJECT_ID (norm));
346
/* But be careful that we do not have gradient saved anywhere else */
347
g_object_set_data (G_OBJECT (mi), "gradient", norm);
350
/* fixme: Really we would want to use _set_vector */
353
gvs->gradient_release_connection.disconnect();
358
gvs->gradient_release_connection = norm->connectRelease(sigc::bind<1>(sigc::ptr_fun(&sp_gvs_gradient_release), gvs));
362
g_signal_emit (G_OBJECT (gvs), signals[VECTOR_SET], 0, norm);
365
/* We do extra undo push here */
366
/* If handler has already done it, it is just NOP */
367
// FIXME: looks like this is never a valid undo step, consider removing this
368
sp_document_done (SP_OBJECT_DOCUMENT (norm), SP_VERB_CONTEXT_GRADIENT,
369
/* TODO: annotate */ "gradient-vector.cpp:350");
374
sp_gvs_gradient_release (SPObject */*obj*/, SPGradientVectorSelector *gvs)
376
/* Disconnect gradient */
378
gvs->gradient_release_connection.disconnect();
383
sp_gvs_rebuild_gui_full (gvs);
387
sp_gvs_defs_release (SPObject */*defs*/, SPGradientVectorSelector *gvs)
391
gvs->defs_release_connection.disconnect();
392
gvs->defs_modified_connection.disconnect();
394
/* Disconnect gradient as well */
396
gvs->gradient_release_connection.disconnect();
401
sp_gvs_rebuild_gui_full (gvs);
405
sp_gvs_defs_modified (SPObject */*defs*/, guint /*flags*/, SPGradientVectorSelector *gvs)
407
/* fixme: We probably have to check some flags here (Lauris) */
409
sp_gvs_rebuild_gui_full (gvs);
406
412
/*##################################################################
407
### Vector Editing Widget
408
##################################################################*/
413
### Vector Editing Widget
414
##################################################################*/
410
416
#include "../widgets/sp-color-notebook.h"
411
417
#include "../widgets/sp-color-preview.h"
455
461
verify_grad(SPGradient *gradient)
460
for ( SPObject *ochild = sp_object_first_child(SP_OBJECT(gradient)) ; ochild != NULL ; ochild = SP_OBJECT_NEXT(ochild) ) {
461
if (SP_IS_STOP (ochild)) {
463
stop = SP_STOP(ochild);
467
Inkscape::XML::Document *xml_doc;
468
xml_doc = SP_OBJECT_REPR(gradient)->document();
472
sp_svg_write_color (c, sizeof(c), 0x00000000);
474
Inkscape::CSSOStringStream os;
475
os << "stop-color:" << c << ";stop-opacity:" << 1.0 << ";";
477
Inkscape::XML::Node *child;
479
child = xml_doc->createElement("svg:stop");
480
sp_repr_set_css_double(child, "offset", 0.0);
481
child->setAttribute("style", os.str().c_str());
482
SP_OBJECT_REPR (gradient)->addChild(child, NULL);
484
child = xml_doc->createElement("svg:stop");
485
sp_repr_set_css_double(child, "offset", 1.0);
486
child->setAttribute("style", os.str().c_str());
487
SP_OBJECT_REPR (gradient)->addChild(child, NULL);
490
sp_repr_set_css_double(SP_OBJECT_REPR(stop), "offset", 0.0);
491
Inkscape::XML::Node *child = SP_OBJECT_REPR(stop)->duplicate(SP_OBJECT_REPR(gradient)->document());
492
sp_repr_set_css_double(child, "offset", 1.0);
493
SP_OBJECT_REPR(gradient)->addChild(child, SP_OBJECT_REPR (stop));
466
for ( SPObject *ochild = sp_object_first_child(SP_OBJECT(gradient)) ; ochild != NULL ; ochild = SP_OBJECT_NEXT(ochild) ) {
467
if (SP_IS_STOP (ochild)) {
469
stop = SP_STOP(ochild);
473
Inkscape::XML::Document *xml_doc;
474
xml_doc = SP_OBJECT_REPR(gradient)->document();
478
sp_svg_write_color (c, sizeof(c), 0x00000000);
480
Inkscape::CSSOStringStream os;
481
os << "stop-color:" << c << ";stop-opacity:" << 1.0 << ";";
483
Inkscape::XML::Node *child;
485
child = xml_doc->createElement("svg:stop");
486
sp_repr_set_css_double(child, "offset", 0.0);
487
child->setAttribute("style", os.str().c_str());
488
SP_OBJECT_REPR (gradient)->addChild(child, NULL);
489
Inkscape::GC::release(child);
491
child = xml_doc->createElement("svg:stop");
492
sp_repr_set_css_double(child, "offset", 1.0);
493
child->setAttribute("style", os.str().c_str());
494
SP_OBJECT_REPR (gradient)->addChild(child, NULL);
495
Inkscape::GC::release(child);
498
sp_repr_set_css_double(SP_OBJECT_REPR(stop), "offset", 0.0);
499
Inkscape::XML::Node *child = SP_OBJECT_REPR(stop)->duplicate(SP_OBJECT_REPR(gradient)->document());
500
sp_repr_set_css_double(child, "offset", 1.0);
501
SP_OBJECT_REPR(gradient)->addChild(child, SP_OBJECT_REPR (stop));
502
Inkscape::GC::release(child);
498
507
select_stop_in_list( GtkWidget *mnu, SPGradient *gradient, SPStop *new_stop)
501
for ( SPObject *ochild = sp_object_first_child(SP_OBJECT(gradient)) ; ochild != NULL ; ochild = SP_OBJECT_NEXT(ochild) ) {
502
if (SP_IS_STOP (ochild)) {
503
if (SP_OBJECT (ochild) == SP_OBJECT(new_stop)) {
504
gtk_option_menu_set_history (GTK_OPTION_MENU (mnu), i);
510
for ( SPObject *ochild = sp_object_first_child(SP_OBJECT(gradient)) ; ochild != NULL ; ochild = SP_OBJECT_NEXT(ochild) ) {
511
if (SP_IS_STOP (ochild)) {
512
if (SP_OBJECT (ochild) == SP_OBJECT(new_stop)) {
513
gtk_option_menu_set_history (GTK_OPTION_MENU (mnu), i);
513
522
update_stop_list( GtkWidget *mnu, SPGradient *gradient, SPStop *new_stop)
516
if (!SP_IS_GRADIENT (gradient))
521
/* Clear old menu, if there is any */
522
if (gtk_option_menu_get_menu (GTK_OPTION_MENU (mnu))) {
523
gtk_option_menu_remove_menu (GTK_OPTION_MENU (mnu));
526
/* Create new menu widget */
527
GtkWidget *m = gtk_menu_new ();
530
if (gradient->has_stops) {
531
for ( SPObject *ochild = sp_object_first_child (SP_OBJECT(gradient)) ; ochild != NULL ; ochild = SP_OBJECT_NEXT(ochild) ) {
532
if (SP_IS_STOP (ochild)) {
533
sl = g_slist_append (sl, ochild);
538
GtkWidget *i = gtk_menu_item_new_with_label (_("No stops in gradient"));
540
gtk_menu_append (GTK_MENU (m), i);
541
gtk_widget_set_sensitive (mnu, FALSE);
544
for (; sl != NULL; sl = sl->next){
547
if (SP_IS_STOP(sl->data)){
548
stop = SP_STOP (sl->data);
549
i = gtk_menu_item_new ();
551
g_object_set_data (G_OBJECT (i), "stop", stop);
552
GtkWidget *hb = gtk_hbox_new (FALSE, 4);
553
GtkWidget *cpv = sp_color_preview_new(sp_stop_get_rgba32(stop));
554
gtk_widget_show (cpv);
555
gtk_container_add ( GTK_CONTAINER (hb), cpv );
556
g_object_set_data ( G_OBJECT (i), "preview", cpv );
557
Inkscape::XML::Node *repr = SP_OBJECT_REPR((SPItem *) sl->data);
558
GtkWidget *l = gtk_label_new (repr->attribute("id"));
560
gtk_misc_set_alignment (GTK_MISC (l), 1.0, 0.5);
561
gtk_box_pack_start (GTK_BOX (hb), l, TRUE, TRUE, 0);
562
gtk_widget_show (hb);
563
gtk_container_add (GTK_CONTAINER (i), hb);
564
gtk_menu_append (GTK_MENU (m), i);
568
gtk_widget_set_sensitive (mnu, TRUE);
570
gtk_option_menu_set_menu (GTK_OPTION_MENU (mnu), m);
573
if (new_stop == NULL) {
574
gtk_option_menu_set_history (GTK_OPTION_MENU (mnu), 0);
576
select_stop_in_list (mnu, gradient, new_stop);
525
if (!SP_IS_GRADIENT (gradient))
530
/* Clear old menu, if there is any */
531
if (gtk_option_menu_get_menu (GTK_OPTION_MENU (mnu))) {
532
gtk_option_menu_remove_menu (GTK_OPTION_MENU (mnu));
535
/* Create new menu widget */
536
GtkWidget *m = gtk_menu_new ();
539
if (gradient->has_stops) {
540
for ( SPObject *ochild = sp_object_first_child (SP_OBJECT(gradient)) ; ochild != NULL ; ochild = SP_OBJECT_NEXT(ochild) ) {
541
if (SP_IS_STOP (ochild)) {
542
sl = g_slist_append (sl, ochild);
547
GtkWidget *i = gtk_menu_item_new_with_label (_("No stops in gradient"));
549
gtk_menu_append (GTK_MENU (m), i);
550
gtk_widget_set_sensitive (mnu, FALSE);
553
for (; sl != NULL; sl = sl->next){
556
if (SP_IS_STOP(sl->data)){
557
stop = SP_STOP (sl->data);
558
i = gtk_menu_item_new ();
560
g_object_set_data (G_OBJECT (i), "stop", stop);
561
GtkWidget *hb = gtk_hbox_new (FALSE, 4);
562
GtkWidget *cpv = sp_color_preview_new(sp_stop_get_rgba32(stop));
563
gtk_widget_show (cpv);
564
gtk_container_add ( GTK_CONTAINER (hb), cpv );
565
g_object_set_data ( G_OBJECT (i), "preview", cpv );
566
Inkscape::XML::Node *repr = SP_OBJECT_REPR((SPItem *) sl->data);
567
GtkWidget *l = gtk_label_new (repr->attribute("id"));
569
gtk_misc_set_alignment (GTK_MISC (l), 1.0, 0.5);
570
gtk_box_pack_start (GTK_BOX (hb), l, TRUE, TRUE, 0);
571
gtk_widget_show (hb);
572
gtk_container_add (GTK_CONTAINER (i), hb);
573
gtk_menu_append (GTK_MENU (m), i);
577
gtk_widget_set_sensitive (mnu, TRUE);
579
gtk_option_menu_set_menu (GTK_OPTION_MENU (mnu), m);
582
if (new_stop == NULL) {
583
gtk_option_menu_set_history (GTK_OPTION_MENU (mnu), 0);
585
select_stop_in_list (mnu, gradient, new_stop);
658
667
sp_repr_set_css_double(SP_OBJECT_REPR(stop), "offset", stop->offset);
660
669
sp_document_done (SP_OBJECT_DOCUMENT (stop), SP_VERB_CONTEXT_GRADIENT,
661
_("Change gradient stop offset"));
670
_("Change gradient stop offset"));
667
676
sp_average_color (guint32 c1, guint32 c2, gdouble p = 0.5)
669
guint32 r = (guint32) (SP_RGBA32_R_U (c1) * p + SP_RGBA32_R_U (c2) * (1 - p));
670
guint32 g = (guint32) (SP_RGBA32_G_U (c1) * p + SP_RGBA32_G_U (c2) * (1 - p));
671
guint32 b = (guint32) (SP_RGBA32_B_U (c1) * p + SP_RGBA32_B_U (c2) * (1 - p));
672
guint32 a = (guint32) (SP_RGBA32_A_U (c1) * p + SP_RGBA32_A_U (c2) * (1 - p));
678
guint32 r = (guint32) (SP_RGBA32_R_U (c1) * p + SP_RGBA32_R_U (c2) * (1 - p));
679
guint32 g = (guint32) (SP_RGBA32_G_U (c1) * p + SP_RGBA32_G_U (c2) * (1 - p));
680
guint32 b = (guint32) (SP_RGBA32_B_U (c1) * p + SP_RGBA32_B_U (c2) * (1 - p));
681
guint32 a = (guint32) (SP_RGBA32_A_U (c1) * p + SP_RGBA32_A_U (c2) * (1 - p));
674
return SP_RGBA32_U_COMPOSE (r, g, b, a);
683
return SP_RGBA32_U_COMPOSE (r, g, b, a);
679
sp_grd_ed_add_stop (GtkWidget *widget, GtkWidget *vb)
688
sp_grd_ed_add_stop (GtkWidget */*widget*/, GtkWidget *vb)
681
SPGradient *gradient = (SPGradient *) g_object_get_data (G_OBJECT(vb), "gradient");
682
verify_grad (gradient);
683
GtkOptionMenu *mnu = (GtkOptionMenu *)g_object_get_data (G_OBJECT(vb), "stopmenu");
685
SPStop *stop = (SPStop *) g_object_get_data (G_OBJECT(gtk_menu_get_active (GTK_MENU(gtk_option_menu_get_menu (mnu)))), "stop");
690
Inkscape::XML::Node *new_stop_repr = NULL;
692
SPStop *next = sp_next_stop (stop);
695
SPStop *prev = sp_prev_stop (stop, gradient);
703
new_stop_repr = SP_OBJECT_REPR(stop)->duplicate(SP_OBJECT_REPR(gradient)->document());
704
SP_OBJECT_REPR(gradient)->addChild(new_stop_repr, SP_OBJECT_REPR(stop));
707
new_stop_repr = SP_OBJECT_REPR(sp_prev_stop(stop, gradient))->duplicate(SP_OBJECT_REPR(gradient)->document());
708
SP_OBJECT_REPR(gradient)->addChild(new_stop_repr, SP_OBJECT_REPR(sp_prev_stop(stop, gradient)));
711
SPStop *newstop = (SPStop *) SP_OBJECT_DOCUMENT(gradient)->getObjectByRepr(new_stop_repr);
713
newstop->offset = (stop->offset + next->offset) * 0.5 ;
715
guint32 const c1 = sp_stop_get_rgba32(stop);
716
guint32 const c2 = sp_stop_get_rgba32(next);
717
guint32 cnew = sp_average_color (c1, c2);
719
Inkscape::CSSOStringStream os;
721
sp_svg_write_color (c, sizeof(c), cnew);
722
gdouble opacity = (gdouble) SP_RGBA32_A_F (cnew);
723
os << "stop-color:" << c << ";stop-opacity:" << opacity <<";";
724
SP_OBJECT_REPR (newstop)->setAttribute("style", os.str().c_str());
690
SPGradient *gradient = (SPGradient *) g_object_get_data (G_OBJECT(vb), "gradient");
691
verify_grad (gradient);
692
GtkOptionMenu *mnu = (GtkOptionMenu *)g_object_get_data (G_OBJECT(vb), "stopmenu");
694
SPStop *stop = (SPStop *) g_object_get_data (G_OBJECT(gtk_menu_get_active (GTK_MENU(gtk_option_menu_get_menu (mnu)))), "stop");
699
Inkscape::XML::Node *new_stop_repr = NULL;
701
SPStop *next = sp_next_stop (stop);
704
SPStop *prev = sp_prev_stop (stop, gradient);
712
new_stop_repr = SP_OBJECT_REPR(stop)->duplicate(SP_OBJECT_REPR(gradient)->document());
713
SP_OBJECT_REPR(gradient)->addChild(new_stop_repr, SP_OBJECT_REPR(stop));
716
new_stop_repr = SP_OBJECT_REPR(sp_prev_stop(stop, gradient))->duplicate(SP_OBJECT_REPR(gradient)->document());
717
SP_OBJECT_REPR(gradient)->addChild(new_stop_repr, SP_OBJECT_REPR(sp_prev_stop(stop, gradient)));
720
SPStop *newstop = (SPStop *) SP_OBJECT_DOCUMENT(gradient)->getObjectByRepr(new_stop_repr);
722
newstop->offset = (stop->offset + next->offset) * 0.5 ;
724
guint32 const c1 = sp_stop_get_rgba32(stop);
725
guint32 const c2 = sp_stop_get_rgba32(next);
726
guint32 cnew = sp_average_color (c1, c2);
728
Inkscape::CSSOStringStream os;
730
sp_svg_write_color (c, sizeof(c), cnew);
731
gdouble opacity = (gdouble) SP_RGBA32_A_F (cnew);
732
os << "stop-color:" << c << ";stop-opacity:" << opacity <<";";
733
SP_OBJECT_REPR (newstop)->setAttribute("style", os.str().c_str());
725
734
sp_repr_set_css_double( SP_OBJECT_REPR(newstop), "offset", (double)newstop->offset);
727
sp_gradient_vector_widget_load_gradient (vb, gradient);
728
Inkscape::GC::release(new_stop_repr);
729
update_stop_list(GTK_WIDGET(mnu), gradient, newstop);
730
GtkWidget *offspin = GTK_WIDGET (g_object_get_data (G_OBJECT (vb), "offspn"));
731
GtkWidget *offslide =GTK_WIDGET (g_object_get_data (G_OBJECT (vb), "offslide"));
732
gtk_widget_set_sensitive (offslide, TRUE);
733
gtk_widget_set_sensitive (GTK_WIDGET (offspin), TRUE);
734
sp_document_done (SP_OBJECT_DOCUMENT (gradient), SP_VERB_CONTEXT_GRADIENT,
735
_("Add gradient stop"));
736
sp_gradient_vector_widget_load_gradient (vb, gradient);
737
Inkscape::GC::release(new_stop_repr);
738
update_stop_list(GTK_WIDGET(mnu), gradient, newstop);
739
GtkWidget *offspin = GTK_WIDGET (g_object_get_data (G_OBJECT (vb), "offspn"));
740
GtkWidget *offslide =GTK_WIDGET (g_object_get_data (G_OBJECT (vb), "offslide"));
741
gtk_widget_set_sensitive (offslide, TRUE);
742
gtk_widget_set_sensitive (GTK_WIDGET (offspin), TRUE);
743
sp_document_done (SP_OBJECT_DOCUMENT (gradient), SP_VERB_CONTEXT_GRADIENT,
744
_("Add gradient stop"));
739
sp_grd_ed_del_stop (GtkWidget *widget, GtkWidget *vb)
748
sp_grd_ed_del_stop (GtkWidget */*widget*/, GtkWidget *vb)
741
SPGradient *gradient = (SPGradient *)g_object_get_data (G_OBJECT(vb), "gradient");
743
GtkOptionMenu *mnu = (GtkOptionMenu *)g_object_get_data (G_OBJECT(vb), "stopmenu");
744
if (!g_object_get_data (G_OBJECT(gtk_menu_get_active (GTK_MENU(gtk_option_menu_get_menu (mnu)))), "stop")) return;
745
SPStop *stop = SP_STOP(g_object_get_data (G_OBJECT(gtk_menu_get_active (GTK_MENU(gtk_option_menu_get_menu (mnu)))), "stop"));
746
if (gradient->vector.stops.size() > 2) { // 2 is the minimum
748
// if we delete first or last stop, move the next/previous to the edge
749
if (stop->offset == 0) {
750
SPStop *next = sp_next_stop (stop);
753
sp_repr_set_css_double (SP_OBJECT_REPR (next), "offset", 0);
755
} else if (stop->offset == 1) {
756
SPStop *prev = sp_prev_stop (stop, gradient);
759
sp_repr_set_css_double (SP_OBJECT_REPR (prev), "offset", 1);
763
SP_OBJECT_REPR(gradient)->removeChild(SP_OBJECT_REPR(stop));
764
sp_gradient_vector_widget_load_gradient (vb, gradient);
765
update_stop_list(GTK_WIDGET(mnu), gradient, NULL);
766
sp_document_done (SP_OBJECT_DOCUMENT (gradient), SP_VERB_CONTEXT_GRADIENT,
767
_("Delete gradient stop"));
750
SPGradient *gradient = (SPGradient *)g_object_get_data (G_OBJECT(vb), "gradient");
752
GtkOptionMenu *mnu = (GtkOptionMenu *)g_object_get_data (G_OBJECT(vb), "stopmenu");
753
if (!g_object_get_data (G_OBJECT(gtk_menu_get_active (GTK_MENU(gtk_option_menu_get_menu (mnu)))), "stop")) return;
754
SPStop *stop = SP_STOP(g_object_get_data (G_OBJECT(gtk_menu_get_active (GTK_MENU(gtk_option_menu_get_menu (mnu)))), "stop"));
755
if (gradient->vector.stops.size() > 2) { // 2 is the minimum
757
// if we delete first or last stop, move the next/previous to the edge
758
if (stop->offset == 0) {
759
SPStop *next = sp_next_stop (stop);
762
sp_repr_set_css_double (SP_OBJECT_REPR (next), "offset", 0);
764
} else if (stop->offset == 1) {
765
SPStop *prev = sp_prev_stop (stop, gradient);
768
sp_repr_set_css_double (SP_OBJECT_REPR (prev), "offset", 1);
772
SP_OBJECT_REPR(gradient)->removeChild(SP_OBJECT_REPR(stop));
773
sp_gradient_vector_widget_load_gradient (vb, gradient);
774
update_stop_list(GTK_WIDGET(mnu), gradient, NULL);
775
sp_document_done (SP_OBJECT_DOCUMENT (gradient), SP_VERB_CONTEXT_GRADIENT,
776
_("Delete gradient stop"));
772
781
static GtkWidget *
773
782
sp_gradient_vector_widget_new (SPGradient *gradient, SPStop *select_stop)
775
GtkWidget *vb, *w, *f, *csel;
777
g_return_val_if_fail (!gradient || SP_IS_GRADIENT (gradient), NULL);
779
vb = gtk_vbox_new (FALSE, PAD);
780
g_signal_connect (G_OBJECT (vb), "destroy", G_CALLBACK (sp_gradient_vector_widget_destroy), NULL);
782
w = sp_gradient_image_new (gradient);
783
g_object_set_data (G_OBJECT (vb), "preview", w);
785
gtk_box_pack_start (GTK_BOX (vb), w, TRUE, TRUE, PAD);
787
gtk_object_set_data (GTK_OBJECT (vb), "gradient", gradient);
788
sp_repr_add_listener (SP_OBJECT_REPR(gradient), &grad_edit_dia_repr_events, vb);
789
GtkTooltips *tt = gtk_tooltips_new ();
792
GtkWidget *mnu = gtk_option_menu_new ();
793
/* Create new menu widget */
794
update_stop_list (GTK_WIDGET(mnu), gradient, NULL);
795
gtk_signal_connect (GTK_OBJECT (mnu), "changed", GTK_SIGNAL_FUNC (sp_grad_edit_select), vb);
796
gtk_widget_show (mnu);
797
gtk_object_set_data (GTK_OBJECT (vb), "stopmenu", mnu);
798
gtk_box_pack_start (GTK_BOX (vb), mnu, FALSE, FALSE, 0);
800
/* Add and Remove buttons */
801
GtkWidget *hb = gtk_hbox_new (FALSE, 1);
802
// TRANSLATORS: "Stop" means: a "phase" of a gradient
803
GtkWidget *b = gtk_button_new_with_label (_("Add stop"));
805
gtk_container_add (GTK_CONTAINER (hb), b);
806
gtk_tooltips_set_tip (tt, b, _("Add another control stop to gradient"), NULL);
807
gtk_signal_connect (GTK_OBJECT (b), "clicked", GTK_SIGNAL_FUNC (sp_grd_ed_add_stop), vb);
808
b = gtk_button_new_with_label (_("Delete stop"));
810
gtk_container_add (GTK_CONTAINER (hb), b);
811
gtk_tooltips_set_tip (tt, b, _("Delete current control stop from gradient"), NULL);
812
gtk_signal_connect (GTK_OBJECT (b), "clicked", GTK_SIGNAL_FUNC (sp_grd_ed_del_stop), vb);
814
gtk_widget_show (hb);
815
gtk_box_pack_start (GTK_BOX (vb),hb, FALSE, FALSE, AUX_BETWEEN_BUTTON_GROUPS);
818
/* Offset Slider and stuff */
819
hb = gtk_hbox_new (FALSE, 0);
822
GtkWidget *l = gtk_label_new (_("Offset:"));
823
gtk_misc_set_alignment (GTK_MISC (l), 1.0, 0.5);
824
gtk_box_pack_start (GTK_BOX (hb),l, FALSE, FALSE, AUX_BETWEEN_BUTTON_GROUPS);
828
GtkAdjustment *Offset_adj = NULL;
829
Offset_adj= (GtkAdjustment *) gtk_adjustment_new (0.0, 0.0, 1.0, 0.01, 0.01, 0.0);
830
gtk_object_set_data (GTK_OBJECT (vb), "offset", Offset_adj);
831
GtkMenu *m = GTK_MENU(gtk_option_menu_get_menu (GTK_OPTION_MENU(mnu)));
832
SPStop *stop = SP_STOP (g_object_get_data (G_OBJECT (gtk_menu_get_active (m)), "stop"));
833
gtk_adjustment_set_value (Offset_adj, stop->offset);
836
GtkWidget *slider = gtk_hscale_new(Offset_adj);
837
gtk_scale_set_draw_value( GTK_SCALE(slider), FALSE );
838
gtk_widget_show (slider);
839
gtk_box_pack_start (GTK_BOX (hb),slider, TRUE, TRUE, AUX_BETWEEN_BUTTON_GROUPS);
840
gtk_object_set_data (GTK_OBJECT (vb), "offslide", slider);
843
GtkWidget *sbtn = gtk_spin_button_new (GTK_ADJUSTMENT (Offset_adj), 0.01, 2);
844
sp_dialog_defocus_on_enter (sbtn);
845
gtk_widget_show (sbtn);
846
gtk_box_pack_start (GTK_BOX (hb),sbtn, FALSE, TRUE, AUX_BETWEEN_BUTTON_GROUPS);
847
gtk_object_set_data (GTK_OBJECT (vb), "offspn", sbtn);
849
if (stop->offset>0 && stop->offset<1) {
850
gtk_widget_set_sensitive (slider, TRUE);
851
gtk_widget_set_sensitive (GTK_WIDGET (sbtn), TRUE);
853
gtk_widget_set_sensitive (slider, FALSE);
854
gtk_widget_set_sensitive (GTK_WIDGET (sbtn), FALSE);
859
gtk_signal_connect (GTK_OBJECT (Offset_adj), "value_changed",
860
GTK_SIGNAL_FUNC (offadjustmentChanged), vb);
862
// gtk_signal_connect (GTK_OBJECT (slider), "changed", GTK_SIGNAL_FUNC (offsliderChanged), vb);
863
gtk_widget_show (hb);
864
gtk_box_pack_start (GTK_BOX (vb), hb, FALSE, FALSE, PAD);
866
// TRANSLATORS: "Stop" means: a "phase" of a gradient
867
f = gtk_frame_new (_("Stop Color"));
869
gtk_box_pack_start (GTK_BOX (vb), f, TRUE, TRUE, PAD);
870
csel = (GtkWidget*)sp_color_selector_new (SP_TYPE_COLOR_NOTEBOOK);
871
g_object_set_data (G_OBJECT (vb), "cselector", csel);
872
gtk_widget_show (csel);
873
gtk_container_add (GTK_CONTAINER (f), csel);
874
g_signal_connect (G_OBJECT (csel), "dragged", G_CALLBACK (sp_gradient_vector_color_dragged), vb);
875
g_signal_connect (G_OBJECT (csel), "changed", G_CALLBACK (sp_gradient_vector_color_changed), vb);
877
gtk_widget_show (vb);
879
sp_gradient_vector_widget_load_gradient (vb, gradient);
882
select_stop_in_list (GTK_WIDGET(mnu), gradient, select_stop);
784
GtkWidget *vb, *w, *f, *csel;
786
g_return_val_if_fail (!gradient || SP_IS_GRADIENT (gradient), NULL);
788
vb = gtk_vbox_new (FALSE, PAD);
789
g_signal_connect (G_OBJECT (vb), "destroy", G_CALLBACK (sp_gradient_vector_widget_destroy), NULL);
791
w = sp_gradient_image_new (gradient);
792
g_object_set_data (G_OBJECT (vb), "preview", w);
794
gtk_box_pack_start (GTK_BOX (vb), w, TRUE, TRUE, PAD);
796
gtk_object_set_data (GTK_OBJECT (vb), "gradient", gradient);
797
sp_repr_add_listener (SP_OBJECT_REPR(gradient), &grad_edit_dia_repr_events, vb);
798
GtkTooltips *tt = gtk_tooltips_new ();
801
GtkWidget *mnu = gtk_option_menu_new ();
802
/* Create new menu widget */
803
update_stop_list (GTK_WIDGET(mnu), gradient, NULL);
804
gtk_signal_connect (GTK_OBJECT (mnu), "changed", GTK_SIGNAL_FUNC (sp_grad_edit_select), vb);
805
gtk_widget_show (mnu);
806
gtk_object_set_data (GTK_OBJECT (vb), "stopmenu", mnu);
807
gtk_box_pack_start (GTK_BOX (vb), mnu, FALSE, FALSE, 0);
809
/* Add and Remove buttons */
810
GtkWidget *hb = gtk_hbox_new (FALSE, 1);
811
// TRANSLATORS: "Stop" means: a "phase" of a gradient
812
GtkWidget *b = gtk_button_new_with_label (_("Add stop"));
814
gtk_container_add (GTK_CONTAINER (hb), b);
815
gtk_tooltips_set_tip (tt, b, _("Add another control stop to gradient"), NULL);
816
gtk_signal_connect (GTK_OBJECT (b), "clicked", GTK_SIGNAL_FUNC (sp_grd_ed_add_stop), vb);
817
b = gtk_button_new_with_label (_("Delete stop"));
819
gtk_container_add (GTK_CONTAINER (hb), b);
820
gtk_tooltips_set_tip (tt, b, _("Delete current control stop from gradient"), NULL);
821
gtk_signal_connect (GTK_OBJECT (b), "clicked", GTK_SIGNAL_FUNC (sp_grd_ed_del_stop), vb);
823
gtk_widget_show (hb);
824
gtk_box_pack_start (GTK_BOX (vb),hb, FALSE, FALSE, AUX_BETWEEN_BUTTON_GROUPS);
827
/* Offset Slider and stuff */
828
hb = gtk_hbox_new (FALSE, 0);
831
GtkWidget *l = gtk_label_new (_("Offset:"));
832
gtk_misc_set_alignment (GTK_MISC (l), 1.0, 0.5);
833
gtk_box_pack_start (GTK_BOX (hb),l, FALSE, FALSE, AUX_BETWEEN_BUTTON_GROUPS);
837
GtkAdjustment *Offset_adj = NULL;
838
Offset_adj= (GtkAdjustment *) gtk_adjustment_new (0.0, 0.0, 1.0, 0.01, 0.01, 0.0);
839
gtk_object_set_data (GTK_OBJECT (vb), "offset", Offset_adj);
840
GtkMenu *m = GTK_MENU(gtk_option_menu_get_menu (GTK_OPTION_MENU(mnu)));
841
SPStop *stop = SP_STOP (g_object_get_data (G_OBJECT (gtk_menu_get_active (m)), "stop"));
842
gtk_adjustment_set_value (Offset_adj, stop->offset);
845
GtkWidget *slider = gtk_hscale_new(Offset_adj);
846
gtk_scale_set_draw_value( GTK_SCALE(slider), FALSE );
847
gtk_widget_show (slider);
848
gtk_box_pack_start (GTK_BOX (hb),slider, TRUE, TRUE, AUX_BETWEEN_BUTTON_GROUPS);
849
gtk_object_set_data (GTK_OBJECT (vb), "offslide", slider);
852
GtkWidget *sbtn = gtk_spin_button_new (GTK_ADJUSTMENT (Offset_adj), 0.01, 2);
853
sp_dialog_defocus_on_enter (sbtn);
854
gtk_widget_show (sbtn);
855
gtk_box_pack_start (GTK_BOX (hb),sbtn, FALSE, TRUE, AUX_BETWEEN_BUTTON_GROUPS);
856
gtk_object_set_data (GTK_OBJECT (vb), "offspn", sbtn);
858
if (stop->offset>0 && stop->offset<1) {
859
gtk_widget_set_sensitive (slider, TRUE);
860
gtk_widget_set_sensitive (GTK_WIDGET (sbtn), TRUE);
862
gtk_widget_set_sensitive (slider, FALSE);
863
gtk_widget_set_sensitive (GTK_WIDGET (sbtn), FALSE);
868
gtk_signal_connect (GTK_OBJECT (Offset_adj), "value_changed",
869
GTK_SIGNAL_FUNC (offadjustmentChanged), vb);
871
// gtk_signal_connect (GTK_OBJECT (slider), "changed", GTK_SIGNAL_FUNC (offsliderChanged), vb);
872
gtk_widget_show (hb);
873
gtk_box_pack_start (GTK_BOX (vb), hb, FALSE, FALSE, PAD);
875
// TRANSLATORS: "Stop" means: a "phase" of a gradient
876
f = gtk_frame_new (_("Stop Color"));
878
gtk_box_pack_start (GTK_BOX (vb), f, TRUE, TRUE, PAD);
879
csel = (GtkWidget*)sp_color_selector_new (SP_TYPE_COLOR_NOTEBOOK);
880
g_object_set_data (G_OBJECT (vb), "cselector", csel);
881
gtk_widget_show (csel);
882
gtk_container_add (GTK_CONTAINER (f), csel);
883
g_signal_connect (G_OBJECT (csel), "dragged", G_CALLBACK (sp_gradient_vector_color_dragged), vb);
884
g_signal_connect (G_OBJECT (csel), "changed", G_CALLBACK (sp_gradient_vector_color_changed), vb);
886
gtk_widget_show (vb);
888
sp_gradient_vector_widget_load_gradient (vb, gradient);
891
select_stop_in_list (GTK_WIDGET(mnu), gradient, select_stop);
890
899
sp_gradient_vector_editor_new (SPGradient *gradient, SPStop *stop)
896
dlg = sp_window_new (_("Gradient editor"), TRUE);
897
if (x == -1000 || y == -1000) {
898
x = prefs_get_int_attribute (prefs_path, "x", 0);
899
y = prefs_get_int_attribute (prefs_path, "y", 0);
901
if (w ==0 || h == 0) {
902
w = prefs_get_int_attribute (prefs_path, "w", 0);
903
h = prefs_get_int_attribute (prefs_path, "h", 0);
909
if (x != 0 || y != 0)
910
gtk_window_move ((GtkWindow *) dlg, x, y);
912
gtk_window_set_position(GTK_WINDOW(dlg), GTK_WIN_POS_CENTER);
913
if (w && h) gtk_window_resize ((GtkWindow *) dlg, w, h);
914
sp_transientize (dlg);
917
g_signal_connect (G_OBJECT (INKSCAPE), "activate_desktop", G_CALLBACK (sp_transientize_callback), &wd);
918
gtk_signal_connect (GTK_OBJECT (dlg), "event", GTK_SIGNAL_FUNC (sp_dialog_event_handler), dlg);
919
gtk_signal_connect (GTK_OBJECT (dlg), "destroy", G_CALLBACK (sp_gradient_vector_dialog_destroy), dlg);
920
gtk_signal_connect (GTK_OBJECT (dlg), "delete_event", G_CALLBACK (sp_gradient_vector_dialog_delete), dlg);
921
g_signal_connect (G_OBJECT (INKSCAPE), "shut_down", G_CALLBACK (sp_gradient_vector_dialog_delete), dlg);
922
g_signal_connect ( G_OBJECT (INKSCAPE), "dialogs_hide", G_CALLBACK (sp_dialog_hide), dlg );
923
g_signal_connect ( G_OBJECT (INKSCAPE), "dialogs_unhide", G_CALLBACK (sp_dialog_unhide), dlg );
925
gtk_container_set_border_width (GTK_CONTAINER (dlg), PAD);
927
wid = (GtkWidget*)sp_gradient_vector_widget_new (gradient, stop);
928
g_object_set_data (G_OBJECT (dlg), "gradient-vector-widget", wid);
929
/* Connect signals */
930
gtk_widget_show (wid);
931
gtk_container_add (GTK_CONTAINER (dlg), wid);
933
// FIXME: temp fix for 0.38
934
// Simply load_gradient into the editor does not work for multi-stop gradients,
935
// as the stop list and other widgets are in a wrong state and crash readily.
936
// Instead we just delete the window (by sending the delete signal)
937
// and call sp_gradient_vector_editor_new again, so it creates the window anew.
940
GtkWidget *widget = (GtkWidget *) dlg;
941
event.type = GDK_DELETE;
942
event.window = widget->window;
943
event.send_event = TRUE;
944
g_object_ref (G_OBJECT (event.window));
945
gtk_main_do_event ((GdkEvent*)&event);
946
g_object_unref (G_OBJECT (event.window));
948
g_assert (dlg == NULL);
949
sp_gradient_vector_editor_new (gradient, stop);
904
Inkscape::Preferences *prefs = Inkscape::Preferences::get();
906
dlg = sp_window_new (_("Gradient editor"), TRUE);
907
if (x == -1000 || y == -1000) {
908
x = prefs->getInt(prefs_path + "x", -1000);
909
y = prefs->getInt(prefs_path + "y", -1000);
911
if (w ==0 || h == 0) {
912
w = prefs->getInt(prefs_path + "w", 0);
913
h = prefs->getInt(prefs_path + "h", 0);
919
if (x != 0 || y != 0)
920
gtk_window_move ((GtkWindow *) dlg, x, y);
922
gtk_window_set_position(GTK_WINDOW(dlg), GTK_WIN_POS_CENTER);
923
if (w && h) gtk_window_resize ((GtkWindow *) dlg, w, h);
924
sp_transientize (dlg);
927
g_signal_connect (G_OBJECT (INKSCAPE), "activate_desktop", G_CALLBACK (sp_transientize_callback), &wd);
928
gtk_signal_connect (GTK_OBJECT (dlg), "event", GTK_SIGNAL_FUNC (sp_dialog_event_handler), dlg);
929
gtk_signal_connect (GTK_OBJECT (dlg), "destroy", G_CALLBACK (sp_gradient_vector_dialog_destroy), dlg);
930
gtk_signal_connect (GTK_OBJECT (dlg), "delete_event", G_CALLBACK (sp_gradient_vector_dialog_delete), dlg);
931
g_signal_connect (G_OBJECT (INKSCAPE), "shut_down", G_CALLBACK (sp_gradient_vector_dialog_delete), dlg);
932
g_signal_connect ( G_OBJECT (INKSCAPE), "dialogs_hide", G_CALLBACK (sp_dialog_hide), dlg );
933
g_signal_connect ( G_OBJECT (INKSCAPE), "dialogs_unhide", G_CALLBACK (sp_dialog_unhide), dlg );
935
gtk_container_set_border_width (GTK_CONTAINER (dlg), PAD);
937
wid = (GtkWidget*)sp_gradient_vector_widget_new (gradient, stop);
938
g_object_set_data (G_OBJECT (dlg), "gradient-vector-widget", wid);
939
/* Connect signals */
940
gtk_widget_show (wid);
941
gtk_container_add (GTK_CONTAINER (dlg), wid);
943
// FIXME: temp fix for 0.38
944
// Simply load_gradient into the editor does not work for multi-stop gradients,
945
// as the stop list and other widgets are in a wrong state and crash readily.
946
// Instead we just delete the window (by sending the delete signal)
947
// and call sp_gradient_vector_editor_new again, so it creates the window anew.
950
GtkWidget *widget = (GtkWidget *) dlg;
951
event.type = GDK_DELETE;
952
event.window = widget->window;
953
event.send_event = TRUE;
954
g_object_ref (G_OBJECT (event.window));
955
gtk_main_do_event ((GdkEvent*)&event);
956
g_object_unref (G_OBJECT (event.window));
958
g_assert (dlg == NULL);
959
sp_gradient_vector_editor_new (gradient, stop);
956
966
sp_gradient_vector_widget_load_gradient (GtkWidget *widget, SPGradient *gradient)
962
old = (SPGradient*)g_object_get_data (G_OBJECT (widget), "gradient");
964
if (old != gradient) {
965
sigc::connection *release_connection;
966
sigc::connection *modified_connection;
968
release_connection = (sigc::connection *)g_object_get_data(G_OBJECT(widget), "gradient_release_connection");
969
modified_connection = (sigc::connection *)g_object_get_data(G_OBJECT(widget), "gradient_modified_connection");
972
g_assert( release_connection != NULL );
973
g_assert( modified_connection != NULL );
974
release_connection->disconnect();
975
modified_connection->disconnect();
976
sp_signal_disconnect_by_data (old, widget);
980
if (!release_connection) {
981
release_connection = new sigc::connection();
983
if (!modified_connection) {
984
modified_connection = new sigc::connection();
986
*release_connection = gradient->connectRelease(sigc::bind<1>(sigc::ptr_fun(&sp_gradient_vector_gradient_release), widget));
987
*modified_connection = gradient->connectModified(sigc::bind<2>(sigc::ptr_fun(&sp_gradient_vector_gradient_modified), widget));
989
if (release_connection) {
990
delete release_connection;
991
release_connection = NULL;
993
if (modified_connection) {
994
delete modified_connection;
995
modified_connection = NULL;
999
g_object_set_data(G_OBJECT(widget), "gradient_release_connection", release_connection);
1000
g_object_set_data(G_OBJECT(widget), "gradient_modified_connection", modified_connection);
1003
g_object_set_data (G_OBJECT (widget), "gradient", gradient);
1006
sp_gradient_ensure_vector (gradient);
1008
GtkOptionMenu *mnu = (GtkOptionMenu *)g_object_get_data (G_OBJECT(widget), "stopmenu");
1009
SPStop *stop = SP_STOP(g_object_get_data (G_OBJECT(gtk_menu_get_active (GTK_MENU(gtk_option_menu_get_menu (mnu)))), "stop"));
1010
guint32 const c = sp_stop_get_rgba32(stop);
1012
/// get the color selector
1013
SPColorSelector *csel = SP_COLOR_SELECTOR(g_object_get_data (G_OBJECT (widget), "cselector"));
1015
csel->base->setAlpha(SP_RGBA32_A_F (c));
1016
SPColor color( SP_RGBA32_R_F (c), SP_RGBA32_G_F (c), SP_RGBA32_B_F (c) );
1018
csel->base->setColor( color );
1022
GtkWidget *w = static_cast<GtkWidget *>(g_object_get_data(G_OBJECT(widget), "preview"));
1023
sp_gradient_image_set_gradient (SP_GRADIENT_IMAGE (w), gradient);
1025
GtkWidget *mnu = static_cast<GtkWidget *>(g_object_get_data(G_OBJECT(widget), "stopmenu"));
1026
update_stop_list (GTK_WIDGET(mnu), gradient, NULL);
1028
// Once the user edits a gradient, it stops being auto-collectable
1029
if (SP_OBJECT_REPR(gradient)->attribute("inkscape:collect")) {
1030
SPDocument *document = SP_OBJECT_DOCUMENT (gradient);
1031
bool saved = sp_document_get_undo_sensitive(document);
1032
sp_document_set_undo_sensitive (document, false);
1033
SP_OBJECT_REPR(gradient)->setAttribute("inkscape:collect", NULL);
1034
sp_document_set_undo_sensitive (document, saved);
972
old = (SPGradient*)g_object_get_data (G_OBJECT (widget), "gradient");
974
if (old != gradient) {
975
sigc::connection *release_connection;
976
sigc::connection *modified_connection;
978
release_connection = (sigc::connection *)g_object_get_data(G_OBJECT(widget), "gradient_release_connection");
979
modified_connection = (sigc::connection *)g_object_get_data(G_OBJECT(widget), "gradient_modified_connection");
982
g_assert( release_connection != NULL );
983
g_assert( modified_connection != NULL );
984
release_connection->disconnect();
985
modified_connection->disconnect();
986
sp_signal_disconnect_by_data (old, widget);
990
if (!release_connection) {
991
release_connection = new sigc::connection();
993
if (!modified_connection) {
994
modified_connection = new sigc::connection();
996
*release_connection = gradient->connectRelease(sigc::bind<1>(sigc::ptr_fun(&sp_gradient_vector_gradient_release), widget));
997
*modified_connection = gradient->connectModified(sigc::bind<2>(sigc::ptr_fun(&sp_gradient_vector_gradient_modified), widget));
999
if (release_connection) {
1000
delete release_connection;
1001
release_connection = NULL;
1003
if (modified_connection) {
1004
delete modified_connection;
1005
modified_connection = NULL;
1009
g_object_set_data(G_OBJECT(widget), "gradient_release_connection", release_connection);
1010
g_object_set_data(G_OBJECT(widget), "gradient_modified_connection", modified_connection);
1013
g_object_set_data (G_OBJECT (widget), "gradient", gradient);
1016
sp_gradient_ensure_vector (gradient);
1018
GtkOptionMenu *mnu = (GtkOptionMenu *)g_object_get_data (G_OBJECT(widget), "stopmenu");
1019
SPStop *stop = SP_STOP(g_object_get_data (G_OBJECT(gtk_menu_get_active (GTK_MENU(gtk_option_menu_get_menu (mnu)))), "stop"));
1020
guint32 const c = sp_stop_get_rgba32(stop);
1022
/// get the color selector
1023
SPColorSelector *csel = SP_COLOR_SELECTOR(g_object_get_data (G_OBJECT (widget), "cselector"));
1025
csel->base->setAlpha(SP_RGBA32_A_F (c));
1026
SPColor color( SP_RGBA32_R_F (c), SP_RGBA32_G_F (c), SP_RGBA32_B_F (c) );
1028
csel->base->setColor( color );
1032
GtkWidget *w = static_cast<GtkWidget *>(g_object_get_data(G_OBJECT(widget), "preview"));
1033
sp_gradient_image_set_gradient (SP_GRADIENT_IMAGE (w), gradient);
1035
GtkWidget *mnu = static_cast<GtkWidget *>(g_object_get_data(G_OBJECT(widget), "stopmenu"));
1036
update_stop_list (GTK_WIDGET(mnu), gradient, NULL);
1038
// Once the user edits a gradient, it stops being auto-collectable
1039
if (SP_OBJECT_REPR(gradient)->attribute("inkscape:collect")) {
1040
SPDocument *document = SP_OBJECT_DOCUMENT (gradient);
1041
bool saved = sp_document_get_undo_sensitive(document);
1042
sp_document_set_undo_sensitive (document, false);
1043
SP_OBJECT_REPR(gradient)->setAttribute("inkscape:collect", NULL);
1044
sp_document_set_undo_sensitive (document, saved);
1041
sp_gradient_vector_dialog_destroy (GtkObject *object, gpointer data)
1051
sp_gradient_vector_dialog_destroy (GtkObject */*object*/, gpointer /*data*/)
1043
sp_signal_disconnect_by_data (INKSCAPE, dlg);
1044
wd.win = dlg = NULL;
1053
sp_signal_disconnect_by_data (INKSCAPE, dlg);
1054
wd.win = dlg = NULL;
1048
1058
static gboolean
1049
sp_gradient_vector_dialog_delete (GtkWidget *widget, GdkEvent *event, GtkWidget *dialog)
1059
sp_gradient_vector_dialog_delete (GtkWidget */*widget*/, GdkEvent */*event*/, GtkWidget */*dialog*/)
1051
gtk_window_get_position ((GtkWindow *) dlg, &x, &y);
1052
gtk_window_get_size ((GtkWindow *) dlg, &w, &h);
1061
gtk_window_get_position ((GtkWindow *) dlg, &x, &y);
1062
gtk_window_get_size ((GtkWindow *) dlg, &w, &h);
1057
prefs_set_int_attribute (prefs_path, "x", x);
1058
prefs_set_int_attribute (prefs_path, "y", y);
1059
prefs_set_int_attribute (prefs_path, "w", w);
1060
prefs_set_int_attribute (prefs_path, "h", h);
1067
Inkscape::Preferences *prefs = Inkscape::Preferences::get();
1068
prefs->setInt(prefs_path + "x", x);
1069
prefs->setInt(prefs_path + "y", y);
1070
prefs->setInt(prefs_path + "w", w);
1071
prefs->setInt(prefs_path + "h", h);
1062
return FALSE; // which means, go ahead and destroy it
1073
return FALSE; // which means, go ahead and destroy it
1065
1076
/* Widget destroy handler */
1068
sp_gradient_vector_widget_destroy (GtkObject *object, gpointer data)
1072
gradient = (GObject*)g_object_get_data (G_OBJECT (object), "gradient");
1074
if (gradient && SP_OBJECT_REPR(gradient)) {
1075
/* Remove signals connected to us */
1076
/* fixme: may use _connect_while_alive as well */
1077
sp_signal_disconnect_by_data (gradient, object);
1078
sp_repr_remove_listener_by_data (SP_OBJECT_REPR(gradient), object);
1083
sp_gradient_vector_gradient_release (SPObject *object, GtkWidget *widget)
1085
sp_gradient_vector_widget_load_gradient (widget, NULL);
1089
sp_gradient_vector_gradient_modified (SPObject *object, guint flags, GtkWidget *widget)
1091
SPGradient *gradient=SP_GRADIENT(object);
1094
sp_gradient_vector_widget_load_gradient (widget, gradient);
1079
sp_gradient_vector_widget_destroy (GtkObject *object, gpointer /*data*/)
1083
gradient = (GObject*)g_object_get_data (G_OBJECT (object), "gradient");
1085
if (gradient && SP_OBJECT_REPR(gradient)) {
1086
/* Remove signals connected to us */
1087
/* fixme: may use _connect_while_alive as well */
1088
sp_signal_disconnect_by_data (gradient, object);
1089
sp_repr_remove_listener_by_data (SP_OBJECT_REPR(gradient), object);
1094
sp_gradient_vector_gradient_release (SPObject */*object*/, GtkWidget *widget)
1096
sp_gradient_vector_widget_load_gradient (widget, NULL);
1100
sp_gradient_vector_gradient_modified (SPObject *object, guint /*flags*/, GtkWidget *widget)
1102
SPGradient *gradient=SP_GRADIENT(object);
1105
sp_gradient_vector_widget_load_gradient (widget, gradient);
1099
1110
static void sp_gradient_vector_color_dragged(SPColorSelector *csel, GtkObject *object)
1101
SPGradient *gradient, *ngr;
1103
if (blocked) return;
1105
gradient = (SPGradient*)g_object_get_data (G_OBJECT (object), "gradient");
1106
if (!gradient) return;
1110
ngr = sp_gradient_ensure_vector_normalized (gradient);
1111
if (ngr != gradient) {
1112
/* Our master gradient has changed */
1113
sp_gradient_vector_widget_load_gradient (GTK_WIDGET (object), ngr);
1116
sp_gradient_ensure_vector (ngr);
1112
SPGradient *gradient, *ngr;
1114
if (blocked) return;
1116
gradient = (SPGradient*)g_object_get_data (G_OBJECT (object), "gradient");
1117
if (!gradient) return;
1121
ngr = sp_gradient_ensure_vector_normalized (gradient);
1122
if (ngr != gradient) {
1123
/* Our master gradient has changed */
1124
sp_gradient_vector_widget_load_gradient (GTK_WIDGET (object), ngr);
1127
sp_gradient_ensure_vector (ngr);
1118
1129
GtkOptionMenu *mnu = (GtkOptionMenu *)g_object_get_data (G_OBJECT(object), "stopmenu");
1119
1130
SPStop *stop = SP_STOP(g_object_get_data (G_OBJECT(gtk_menu_get_active (GTK_MENU(gtk_option_menu_get_menu (mnu)))), "stop"));