Code

A simple layout document as to what, why and how is cppification.
[inkscape.git] / src / widgets / gradient-toolbar.cpp
1 /*
2  * Gradient aux toolbar
3  *
4  * Authors:
5  *   bulia byak <bulia@dr.com>
6  *   Johan Engelen <j.b.c.engelen@ewi.utwente.nl>
7  *
8  * Copyright (C) 2007 Johan Engelen
9  * Copyright (C) 2005 authors
10  *
11  * Released under GNU GPL, read the file 'COPYING' for more information
12  */
14 #ifdef HAVE_CONFIG_H
15 # include "config.h"
16 #endif
18 #include <gtk/gtk.h>
20 #include "macros.h"
21 #include "widgets/button.h"
22 #include "widgets/widget-sizes.h"
23 #include "widgets/spw-utilities.h"
24 #include "widgets/spinbutton-events.h"
25 #include "widgets/gradient-vector.h"
26 #include "widgets/gradient-image.h"
27 #include "style.h"
29 #include "preferences.h"
30 #include "document-private.h"
31 #include "desktop.h"
32 #include "desktop-handles.h"
33 #include <glibmm/i18n.h>
35 #include "gradient-context.h"
36 #include "gradient-drag.h"
37 #include "sp-linear-gradient.h"
38 #include "sp-radial-gradient.h"
39 #include "gradient-chemistry.h"
40 #include "selection.h"
41 #include "ui/icon-names.h"
43 #include "toolbox.h"
46 //########################
47 //##       Gradient     ##
48 //########################
50 static void gr_toggle_type (GtkWidget *button, gpointer data) {
51     Inkscape::Preferences *prefs = Inkscape::Preferences::get();
52     GtkWidget *linear = (GtkWidget *) g_object_get_data (G_OBJECT(data), "linear");
53     GtkWidget *radial = (GtkWidget *) g_object_get_data (G_OBJECT(data), "radial");
54     if (button == linear && gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (linear))) {
55         prefs->setInt("/tools/gradient/newgradient", SP_GRADIENT_TYPE_LINEAR);
56         if (radial) gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (radial), FALSE);
57     } else if (button == radial && gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (radial))) {
58         prefs->setInt("/tools/gradient/newgradient", SP_GRADIENT_TYPE_RADIAL);
59         if (linear) gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (linear), FALSE);
60     }
61 }
63 static void gr_toggle_fillstroke (GtkWidget *button, gpointer data) {
64     Inkscape::Preferences *prefs = Inkscape::Preferences::get();
65     GtkWidget *fill = (GtkWidget *) g_object_get_data (G_OBJECT(data), "fill");
66     GtkWidget *stroke = (GtkWidget *) g_object_get_data (G_OBJECT(data), "stroke");
67     if (button == fill && gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (fill))) {
68         prefs->setBool("/tools/gradient/newfillorstroke", true);
69         if (stroke) gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (stroke), FALSE);
70     } else if (button == stroke && gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (stroke))) {
71         prefs->setBool("/tools/gradient/newfillorstroke", false);
72         if (fill) gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (fill), FALSE);
73     }
74 }
76 void
77 gr_apply_gradient_to_item (SPItem *item, SPGradient *gr, SPGradientType new_type, guint new_fill, bool do_fill, bool do_stroke)
78 {
79     SPStyle *style = SP_OBJECT_STYLE (item);
81     if (do_fill) {
82         if (style && (style->fill.isPaintserver()) &&
83             SP_IS_GRADIENT (SP_OBJECT_STYLE_FILL_SERVER (item))) {
84             SPObject *server = SP_OBJECT_STYLE_FILL_SERVER (item);
85             if (SP_IS_LINEARGRADIENT (server)) {
86                 sp_item_set_gradient(item, gr, SP_GRADIENT_TYPE_LINEAR, true);
87             } else if (SP_IS_RADIALGRADIENT (server)) {
88                 sp_item_set_gradient(item, gr, SP_GRADIENT_TYPE_RADIAL, true);
89             }
90         } else if (new_fill) {
91             sp_item_set_gradient(item, gr, new_type, true);
92         }
93     }
95     if (do_stroke) {
96         if (style && (style->stroke.isPaintserver()) &&
97             SP_IS_GRADIENT (SP_OBJECT_STYLE_STROKE_SERVER (item))) {
98             SPObject *server = SP_OBJECT_STYLE_STROKE_SERVER (item);
99             if (SP_IS_LINEARGRADIENT (server)) {
100                 sp_item_set_gradient(item, gr, SP_GRADIENT_TYPE_LINEAR, false);
101             } else if (SP_IS_RADIALGRADIENT (server)) {
102                 sp_item_set_gradient(item, gr, SP_GRADIENT_TYPE_RADIAL, false);
103             }
104         } else if (!new_fill) {
105             sp_item_set_gradient(item, gr, new_type, false);
106         }
107     }
110 /**
111 Applies gradient vector gr to the gradients attached to the selected dragger of drag, or if none,
112 to all objects in selection. If there was no previous gradient on an item, uses gradient type and
113 fill/stroke setting from preferences to create new default (linear: left/right; radial: centered)
114 gradient.
115 */
116 void
117 gr_apply_gradient (Inkscape::Selection *selection, GrDrag *drag, SPGradient *gr)
119     Inkscape::Preferences *prefs = Inkscape::Preferences::get();
120     SPGradientType new_type = (SPGradientType) prefs->getInt("/tools/gradient/newgradient", SP_GRADIENT_TYPE_LINEAR);
121     guint new_fill = prefs->getBool("/tools/gradient/newfillorstroke", true);
124     // GRADIENTFIXME: make this work for multiple selected draggers.
126     // First try selected dragger
127     if (drag && drag->selected) {
128         GrDragger *dragger = (GrDragger*) drag->selected->data;
129         for (GSList const* i = dragger->draggables; i != NULL; i = i->next) { // for all draggables of dragger
130             GrDraggable *draggable = (GrDraggable *) i->data;
131             gr_apply_gradient_to_item (draggable->item, gr, new_type, new_fill, draggable->fill_or_stroke, !draggable->fill_or_stroke);
132         }
133         return;
134     }
136    // If no drag or no dragger selected, act on selection
137    for (GSList const* i = selection->itemList(); i != NULL; i = i->next) {
138        gr_apply_gradient_to_item (SP_ITEM(i->data), gr, new_type, new_fill, new_fill, !new_fill);
139    }
142 void
143 gr_item_activate (GtkMenuItem *menuitem, gpointer data)
145     SPGradient *gr = (SPGradient *) g_object_get_data (G_OBJECT (menuitem), "gradient");
146     gr = sp_gradient_ensure_vector_normalized(gr);
148     SPDesktop *desktop = (SPDesktop *) data;
149     Inkscape::Selection *selection = sp_desktop_selection (desktop);
150     SPEventContext *ev = sp_desktop_event_context (desktop);
152     gr_apply_gradient (selection, ev? ev->get_drag() : NULL, gr);
154     SPDocumentUndo::done (sp_desktop_document (desktop), SP_VERB_CONTEXT_GRADIENT,
155                       _("Assign gradient to object"));
158 gchar *
159 gr_prepare_label (SPObject *obj)
161     const gchar *id = obj->defaultLabel();
162     if (strlen(id) > 15 && (!strncmp (id, "#linearGradient", 15) || !strncmp (id, "#radialGradient", 15)))
163         return g_strdup_printf ("<small>#%s</small>", id+15);
164     return g_strdup_printf ("<small>%s</small>", id);
167 GtkWidget *gr_vector_list(SPDesktop *desktop, bool selection_empty, SPGradient *gr_selected, bool gr_multi)
169     SPDocument *document = sp_desktop_document (desktop);
171     GtkWidget *om = gtk_option_menu_new ();
172     GtkWidget *m = gtk_menu_new ();
174     GSList *gl = NULL;
175     const GSList *gradients = document->get_resource_list ("gradient");
176     for (const GSList *i = gradients; i != NULL; i = i->next) {
177         SPGradient *grad = SP_GRADIENT(i->data);
178         if ( grad->hasStops() && !grad->isSolid() ) {
179             gl = g_slist_prepend (gl, i->data);
180         }
181     }
182     gl = g_slist_reverse (gl);
184     guint pos = 0;
185     guint idx = 0;
187     if (!gl) {
188         // The document has no gradients
189         GtkWidget *l = gtk_label_new("");
190         gtk_label_set_markup (GTK_LABEL(l), _("<small>No gradients</small>"));
191         GtkWidget *i = gtk_menu_item_new ();
192         gtk_container_add (GTK_CONTAINER (i), l);
194         gtk_widget_show (i);
195         gtk_menu_append (GTK_MENU (m), i);
196         gtk_widget_set_sensitive (om, FALSE);
197     } else if (selection_empty) {
198         // Document has gradients, but nothing is currently selected.
199         GtkWidget *l = gtk_label_new("");
200         gtk_label_set_markup (GTK_LABEL(l), _("<small>Nothing selected</small>"));
201         GtkWidget *i = gtk_menu_item_new ();
202         gtk_container_add (GTK_CONTAINER (i), l);
204         gtk_widget_show (i);
205         gtk_menu_append (GTK_MENU (m), i);
206         gtk_widget_set_sensitive (om, FALSE);
207     } else {
209         if (gr_selected == NULL) {
210             GtkWidget *l = gtk_label_new("");
211             gtk_label_set_markup (GTK_LABEL(l), _("<small>No gradients in selection</small>"));
212             GtkWidget *i = gtk_menu_item_new ();
213             gtk_container_add (GTK_CONTAINER (i), l);
215             gtk_widget_show (i);
216             gtk_menu_append (GTK_MENU (m), i);
217         }
219         if (gr_multi) {
220             GtkWidget *l = gtk_label_new("");
221             gtk_label_set_markup (GTK_LABEL(l), _("<small>Multiple gradients</small>"));
222             GtkWidget *i = gtk_menu_item_new ();
223             gtk_container_add (GTK_CONTAINER (i), l);
225             gtk_widget_show (i);
226             gtk_menu_append (GTK_MENU (m), i);
227         }
229         while (gl) {
230             SPGradient *gradient = SP_GRADIENT (gl->data);
231             gl = g_slist_remove (gl, gradient);
233             GtkWidget *i = gtk_menu_item_new ();
234             g_object_set_data (G_OBJECT (i), "gradient", gradient);
235             g_signal_connect (G_OBJECT (i), "activate", G_CALLBACK (gr_item_activate), desktop);
237             GtkWidget *image = sp_gradient_image_new (gradient);
239             GtkWidget *hb = gtk_hbox_new (FALSE, 4);
240             GtkWidget *l = gtk_label_new ("");
241             gchar *label = gr_prepare_label (SP_OBJECT(gradient));
242             gtk_label_set_markup (GTK_LABEL(l), label);
243             g_free (label);
244             gtk_misc_set_alignment (GTK_MISC (l), 1.0, 0.5);
245             gtk_box_pack_start (GTK_BOX (hb), l, TRUE, TRUE, 0);
246             gtk_box_pack_start (GTK_BOX (hb), image, FALSE, FALSE, 0);
248             gtk_widget_show_all (i);
250             gtk_container_add (GTK_CONTAINER (i), hb);
252             gtk_menu_append (GTK_MENU (m), i);
254             if (gradient == gr_selected) {
255                 pos = idx;
256             }
257             idx ++;
258         }
259         gtk_widget_set_sensitive (om, TRUE);
260     }
262     gtk_option_menu_set_menu (GTK_OPTION_MENU (om), m);
263     /* Select the current gradient, or the Multi/Nothing line */
264     if (gr_multi || gr_selected == NULL)
265         gtk_option_menu_set_history (GTK_OPTION_MENU (om), 0);
266     else
267         gtk_option_menu_set_history (GTK_OPTION_MENU (om), pos);
269     return om;
273 void gr_read_selection( Inkscape::Selection *selection,
274                         GrDrag *drag,
275                         SPGradient *&gr_selected,
276                         bool &gr_multi,
277                         SPGradientSpread &spr_selected,
278                         bool &spr_multi )
280     if (drag && drag->selected) {
281         // GRADIENTFIXME: make this work for more than one selected dragger?
282         GrDragger *dragger = static_cast<GrDragger*>(drag->selected->data);
283         for (GSList const* i = dragger->draggables; i; i = i->next) { // for all draggables of dragger
284             GrDraggable *draggable = static_cast<GrDraggable *>(i->data);
285             SPGradient *gradient = sp_item_gradient_get_vector(draggable->item, draggable->fill_or_stroke);
286             SPGradientSpread spread = sp_item_gradient_get_spread(draggable->item, draggable->fill_or_stroke);
288             if (gradient && gradient->isSolid()) {
289                 gradient = 0;
290             }
292             if (gradient && (gradient != gr_selected)) {
293                 if (gr_selected) {
294                     gr_multi = true;
295                 } else {
296                     gr_selected = gradient;
297                 }
298             }
299             if (spread != spr_selected) {
300                 if (spr_selected != INT_MAX) {
301                     spr_multi = true;
302                 } else {
303                     spr_selected = spread;
304                 }
305             }
306          }
307         return;
308     }
310    // If no selected dragger, read desktop selection
311    for (GSList const* i = selection->itemList(); i; i = i->next) {
312         SPItem *item = SP_ITEM(i->data);
313         SPStyle *style = SP_OBJECT_STYLE (item);
315         if (style && (style->fill.isPaintserver())) {
316             SPObject *server = SP_OBJECT_STYLE_FILL_SERVER (item);
317             if (SP_IS_GRADIENT(server)) {
318                 SPGradient *gradient = SP_GRADIENT(server)->getVector();
319                 SPGradientSpread spread = SP_GRADIENT(server)->fetchSpread();
321                 if (gradient && gradient->isSolid()) {
322                     gradient = 0;
323                 }
325                 if (gradient && (gradient != gr_selected)) {
326                     if (gr_selected) {
327                         gr_multi = true;
328                     } else {
329                         gr_selected = gradient;
330                     }
331                 }
332                 if (spread != spr_selected) {
333                     if (spr_selected != INT_MAX) {
334                         spr_multi = true;
335                     } else {
336                         spr_selected = spread;
337                     }
338                 }
339             }
340         }
341         if (style && (style->stroke.isPaintserver())) {
342             SPObject *server = SP_OBJECT_STYLE_STROKE_SERVER (item);
343             if (SP_IS_GRADIENT(server)) {
344                 SPGradient *gradient = SP_GRADIENT(server)->getVector();
345                 SPGradientSpread spread = SP_GRADIENT(server)->fetchSpread();
347                 if (gradient && gradient->isSolid()) {
348                     gradient = 0;
350                 }
352                 if (gradient && (gradient != gr_selected)) {
353                     if (gr_selected) {
354                         gr_multi = true;
355                     } else {
356                         gr_selected = gradient;
357                     }
358                 }
359                 if (spread != spr_selected) {
360                     if (spr_selected != INT_MAX) {
361                         spr_multi = true;
362                     } else {
363                         spr_selected = spread;
364                     }
365                 }
366             }
367         }
368     }
369  }
371 static void gr_tb_selection_changed(Inkscape::Selection * /*selection*/, gpointer data)
373     GtkWidget *widget = GTK_WIDGET(data);
375     SPDesktop *desktop = static_cast<SPDesktop *>(g_object_get_data(G_OBJECT(widget), "desktop"));
376     if (desktop) {
377         Inkscape::Selection *selection = sp_desktop_selection(desktop); // take from desktop, not from args
378         if (selection) {
379             SPEventContext *ev = sp_desktop_event_context(desktop);
381             GtkWidget *om = (GtkWidget *) g_object_get_data(G_OBJECT(widget), "menu");
382             if (om) {
383                 gtk_widget_destroy(om);
384                 om = 0;
385             }
387             SPGradient *gr_selected = 0;
388             bool gr_multi = false;
390             SPGradientSpread spr_selected = static_cast<SPGradientSpread>(INT_MAX); // meaning undefined
391             bool spr_multi = false;
393             gr_read_selection(selection, ev ? ev->get_drag() : 0, gr_selected, gr_multi, spr_selected, spr_multi);
395             om = gr_vector_list(desktop, selection->isEmpty(), gr_selected, gr_multi);
396             g_object_set_data(G_OBJECT(widget), "menu", om);
398             GtkWidget *buttons = (GtkWidget *) g_object_get_data(G_OBJECT(widget), "buttons");
399             gtk_widget_set_sensitive(buttons, (gr_selected && !gr_multi));
401             gtk_box_pack_start(GTK_BOX(widget), om, TRUE, TRUE, 0);
403             gtk_widget_show_all(widget);
404         }
405     }
408 static void
409 gr_tb_selection_modified (Inkscape::Selection *selection, guint /*flags*/, gpointer data)
411     gr_tb_selection_changed (selection, data);
414 static void
415 gr_drag_selection_changed (gpointer /*dragger*/, gpointer data)
417     gr_tb_selection_changed (NULL, data);
420 static void
421 gr_defs_release (SPObject */*defs*/, GtkWidget *widget)
423     gr_tb_selection_changed (NULL, (gpointer) widget);
426 static void
427 gr_defs_modified (SPObject */*defs*/, guint /*flags*/, GtkWidget *widget)
429     gr_tb_selection_changed (NULL, (gpointer) widget);
432 static void gr_disconnect_sigc (GObject */*obj*/, sigc::connection *connection) {
433     connection->disconnect();
434     delete connection;
437 static void
438 gr_edit (GtkWidget */*button*/, GtkWidget *widget)
440     GtkWidget *om = (GtkWidget *) g_object_get_data (G_OBJECT(widget), "menu");
442     spinbutton_defocus(GTK_OBJECT(widget));
444     if (om) {
445         GtkWidget *i = gtk_menu_get_active (GTK_MENU (gtk_option_menu_get_menu (GTK_OPTION_MENU (om))));
446         SPGradient *gr = (SPGradient *) g_object_get_data (G_OBJECT(i), "gradient");
448         if (gr) {
449             GtkWidget *dialog = sp_gradient_vector_editor_new (gr);
450             gtk_widget_show (dialog);
451         }
452     }
455 GtkWidget * gr_change_widget(SPDesktop *desktop)
457     Inkscape::Selection *selection = sp_desktop_selection (desktop);
458     SPDocument *document = sp_desktop_document (desktop);
459     SPEventContext *ev = sp_desktop_event_context (desktop);
461     SPGradient *gr_selected = NULL;
462     bool gr_multi = false;
464     SPGradientSpread spr_selected = (SPGradientSpread) INT_MAX; // meaning undefined
465     bool spr_multi = false;
467     GtkTooltips *tt = gtk_tooltips_new();
469     gr_read_selection (selection, ev? ev->get_drag() : 0, gr_selected, gr_multi, spr_selected, spr_multi);
471     GtkWidget *widget = gtk_hbox_new(FALSE, FALSE);
472     gtk_object_set_data(GTK_OBJECT(widget), "dtw", desktop->canvas);
473     g_object_set_data (G_OBJECT (widget), "desktop", desktop);
475     GtkWidget *om = gr_vector_list (desktop, selection->isEmpty(), gr_selected, gr_multi);
476     g_object_set_data (G_OBJECT (widget), "menu", om);
478     gtk_box_pack_start (GTK_BOX (widget), om, TRUE, TRUE, 0);
480     {
481     GtkWidget *buttons = gtk_hbox_new(FALSE, 1);
483     /* Edit... */
484     {
485         GtkWidget *hb = gtk_hbox_new(FALSE, 1);
486         GtkWidget *b = gtk_button_new_with_label(_("Edit..."));
487         gtk_tooltips_set_tip(tt, b, _("Edit the stops of the gradient"), NULL);
488         gtk_widget_show(b);
489         gtk_container_add(GTK_CONTAINER(hb), b);
490         gtk_signal_connect(GTK_OBJECT(b), "clicked", GTK_SIGNAL_FUNC(gr_edit), widget);
491         gtk_box_pack_start (GTK_BOX(buttons), hb, FALSE, FALSE, 0);
492     }
494     gtk_box_pack_end (GTK_BOX(widget), buttons, FALSE, FALSE, 0);
495     g_object_set_data (G_OBJECT(widget), "buttons", buttons);
496     gtk_widget_set_sensitive (buttons, (gr_selected && !gr_multi));
497     }
499     // connect to selection modified and changed signals
500     sigc::connection *conn1 = new sigc::connection (selection->connectChanged(
501         sigc::bind (
502             sigc::ptr_fun(&gr_tb_selection_changed),
503             (gpointer)widget )
504     ));
505     sigc::connection *conn2 = new sigc::connection (selection->connectModified(
506         sigc::bind (
507             sigc::ptr_fun(&gr_tb_selection_modified),
508             (gpointer)widget )
509     ));
511     sigc::connection *conn3 = new sigc::connection (desktop->connectToolSubselectionChanged(
512         sigc::bind (
513             sigc::ptr_fun(&gr_drag_selection_changed),
514             (gpointer)widget )
515     ));
517     // when widget is destroyed, disconnect
518     g_signal_connect(G_OBJECT(widget), "destroy", G_CALLBACK(gr_disconnect_sigc), conn1);
519     g_signal_connect(G_OBJECT(widget), "destroy", G_CALLBACK(gr_disconnect_sigc), conn2);
520     g_signal_connect(G_OBJECT(widget), "destroy", G_CALLBACK(gr_disconnect_sigc), conn3);
522     // connect to release and modified signals of the defs (i.e. when someone changes gradient)
523     sigc::connection *release_connection = new sigc::connection();
524     *release_connection = SP_DOCUMENT_DEFS(document)->connectRelease(sigc::bind<1>(sigc::ptr_fun(&gr_defs_release), widget));
525     sigc::connection *modified_connection = new sigc::connection();
526     *modified_connection = SP_DOCUMENT_DEFS(document)->connectModified(sigc::bind<2>(sigc::ptr_fun(&gr_defs_modified), widget));
528     // when widget is destroyed, disconnect
529     g_signal_connect(G_OBJECT(widget), "destroy", G_CALLBACK(gr_disconnect_sigc), release_connection);
530     g_signal_connect(G_OBJECT(widget), "destroy", G_CALLBACK(gr_disconnect_sigc), modified_connection);
532     gtk_widget_show_all (widget);
533     return widget;
536 GtkWidget *
537 sp_gradient_toolbox_new(SPDesktop *desktop)
539     Inkscape::Preferences *prefs = Inkscape::Preferences::get();
540     GtkWidget *tbl = gtk_toolbar_new();
542     gtk_object_set_data(GTK_OBJECT(tbl), "dtw", desktop->canvas);
543     gtk_object_set_data(GTK_OBJECT(tbl), "desktop", desktop);
545     GtkTooltips *tt = gtk_tooltips_new();
547     sp_toolbox_add_label(tbl, _("<b>New:</b>"));
549     // TODO replace aux_toolbox_space(tbl, AUX_SPACING);
551     {
552     GtkWidget *cvbox = gtk_vbox_new (FALSE, 0);
553     GtkWidget *cbox = gtk_hbox_new (FALSE, 0);
555     {
556     GtkWidget *button = sp_button_new_from_data( Inkscape::ICON_SIZE_DECORATION,
557                                               SP_BUTTON_TYPE_TOGGLE,
558                                               NULL,
559                                               INKSCAPE_ICON_PAINT_GRADIENT_LINEAR,
560                                               _("Create linear gradient"),
561                                               tt);
562     g_signal_connect_after (G_OBJECT (button), "clicked", G_CALLBACK (gr_toggle_type), tbl);
563     g_object_set_data(G_OBJECT(tbl), "linear", button);
564     gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button),
565               prefs->getInt("/tools/gradient/newgradient", SP_GRADIENT_TYPE_LINEAR) == SP_GRADIENT_TYPE_LINEAR);
566     gtk_box_pack_start(GTK_BOX(cbox), button, FALSE, FALSE, 0);
567     }
569     {
570     GtkWidget *button = sp_button_new_from_data( Inkscape::ICON_SIZE_DECORATION,
571                                               SP_BUTTON_TYPE_TOGGLE,
572                                               NULL,
573                                               INKSCAPE_ICON_PAINT_GRADIENT_RADIAL,
574                                               _("Create radial (elliptic or circular) gradient"),
575                                               tt);
576     g_signal_connect_after (G_OBJECT (button), "clicked", G_CALLBACK (gr_toggle_type), tbl);
577     g_object_set_data(G_OBJECT(tbl), "radial", button);
578     gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button),
579               prefs->getInt("/tools/gradient/newgradient", SP_GRADIENT_TYPE_LINEAR) == SP_GRADIENT_TYPE_RADIAL);
580     gtk_box_pack_start(GTK_BOX(cbox), button, FALSE, FALSE, 0);
581     }
583     gtk_box_pack_start(GTK_BOX(cvbox), cbox, TRUE, FALSE, 0);
584     gtk_toolbar_append_widget( GTK_TOOLBAR(tbl), cvbox, "", "" );
585     }
587     // TODO replace aux_toolbox_space(tbl, AUX_SPACING);
589     sp_toolbox_add_label(tbl, _("on"), false);
591     // TODO replace aux_toolbox_space(tbl, AUX_SPACING);
593     {
594         GtkWidget *cvbox = gtk_vbox_new (FALSE, 0);
595     GtkWidget *cbox = gtk_hbox_new (FALSE, 0);
597     {
598     GtkWidget *button = sp_button_new_from_data( Inkscape::ICON_SIZE_DECORATION,
599                                               SP_BUTTON_TYPE_TOGGLE,
600                                               NULL,
601                                               INKSCAPE_ICON_OBJECT_FILL,
602                                               _("Create gradient in the fill"),
603                                               tt);
604     g_signal_connect_after (G_OBJECT (button), "clicked", G_CALLBACK (gr_toggle_fillstroke), tbl);
605     g_object_set_data(G_OBJECT(tbl), "fill", button);
606     gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button),
607                                   prefs->getBool("/tools/gradient/newfillorstroke", true));
608     gtk_box_pack_start(GTK_BOX(cbox), button, FALSE, FALSE, 0);
609     }
611     {
612     GtkWidget *button = sp_button_new_from_data( Inkscape::ICON_SIZE_DECORATION,
613                                               SP_BUTTON_TYPE_TOGGLE,
614                                               NULL,
615                                               INKSCAPE_ICON_OBJECT_STROKE,
616                                               _("Create gradient in the stroke"),
617                                               tt);
618     g_signal_connect_after (G_OBJECT (button), "clicked", G_CALLBACK (gr_toggle_fillstroke), tbl);
619     g_object_set_data(G_OBJECT(tbl), "stroke", button);
620     gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button),
621                                   !prefs->getBool("/tools/gradient/newfillorstroke", true));
622     gtk_box_pack_start(GTK_BOX(cbox), button, FALSE, FALSE, 0);
623     }
625     gtk_box_pack_start(GTK_BOX(cvbox), cbox, TRUE, TRUE, 3);
626     gtk_toolbar_append_widget( GTK_TOOLBAR(tbl), cvbox, "", "" );
627     }
630     sp_toolbox_add_label(tbl, _("<b>Change:</b>"));
632     // TODO replace aux_toolbox_space(tbl, AUX_SPACING);
634     {
635         GtkWidget *vectors = gr_change_widget (desktop);
636         gtk_toolbar_append_widget( GTK_TOOLBAR(tbl), vectors, "", "" );
637     }
639     gtk_widget_show_all(tbl);
640     sp_set_font_size_smaller (tbl);
642     return tbl;
648 /*
649   Local Variables:
650   mode:c++
651   c-file-style:"stroustrup"
652   c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
653   indent-tabs-mode:nil
654   fill-column:99
655   End:
656 */
657 // vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4 :