summaryrefslogtreecommitdiffstats
path: root/src/widgets/gradient-toolbar.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/widgets/gradient-toolbar.cpp')
-rw-r--r--src/widgets/gradient-toolbar.cpp665
1 files changed, 665 insertions, 0 deletions
diff --git a/src/widgets/gradient-toolbar.cpp b/src/widgets/gradient-toolbar.cpp
new file mode 100644
index 000000000..53e194989
--- /dev/null
+++ b/src/widgets/gradient-toolbar.cpp
@@ -0,0 +1,665 @@
+/*
+ * Gradient aux toolbar
+ *
+ * Authors:
+ * bulia byak <bulia@dr.com>
+ *
+ * Copyright (C) 2005 authors
+ *
+ * Released under GNU GPL, read the file 'COPYING' for more information
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <gtk/gtk.h>
+
+#include "macros.h"
+#include "widgets/button.h"
+#include "widgets/widget-sizes.h"
+#include "widgets/spw-utilities.h"
+#include "widgets/spinbutton-events.h"
+#include "widgets/gradient-vector.h"
+#include "widgets/gradient-image.h"
+#include "style.h"
+
+#include "prefs-utils.h"
+#include "document-private.h"
+#include "desktop.h"
+#include "desktop-handles.h"
+#include <glibmm/i18n.h>
+
+#include "gradient-context.h"
+#include "gradient-drag.h"
+#include "sp-linear-gradient.h"
+#include "sp-radial-gradient.h"
+#include "gradient-chemistry.h"
+#include "selection.h"
+
+#include "toolbox.h"
+
+
+//########################
+//## Gradient ##
+//########################
+
+static void gr_toggle_type (GtkWidget *button, gpointer data) {
+ GtkWidget *linear = (GtkWidget *) g_object_get_data (G_OBJECT(data), "linear");
+ GtkWidget *radial = (GtkWidget *) g_object_get_data (G_OBJECT(data), "radial");
+ if (button == linear && gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (linear))) {
+ prefs_set_int_attribute ("tools.gradient", "newgradient", SP_GRADIENT_TYPE_LINEAR);
+ if (radial) gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (radial), FALSE);
+ } else if (button == radial && gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (radial))) {
+ prefs_set_int_attribute ("tools.gradient", "newgradient", SP_GRADIENT_TYPE_RADIAL);
+ if (linear) gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (linear), FALSE);
+ }
+}
+
+static void gr_toggle_fillstroke (GtkWidget *button, gpointer data) {
+ GtkWidget *fill = (GtkWidget *) g_object_get_data (G_OBJECT(data), "fill");
+ GtkWidget *stroke = (GtkWidget *) g_object_get_data (G_OBJECT(data), "stroke");
+ if (button == fill && gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (fill))) {
+ prefs_set_int_attribute ("tools.gradient", "newfillorstroke", 1);
+ if (stroke) gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (stroke), FALSE);
+ } else if (button == stroke && gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (stroke))) {
+ prefs_set_int_attribute ("tools.gradient", "newfillorstroke", 0);
+ if (fill) gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (fill), FALSE);
+ }
+}
+
+void
+gr_apply_gradient_to_item (SPItem *item, SPGradient *gr, SPGradientType new_type, guint new_fill, bool do_fill, bool do_stroke)
+{
+ SPStyle *style = SP_OBJECT_STYLE (item);
+
+ if (do_fill) {
+ if (style && (style->fill.type == SP_PAINT_TYPE_PAINTSERVER) &&
+ SP_IS_GRADIENT (SP_OBJECT_STYLE_FILL_SERVER (item))) {
+ SPObject *server = SP_OBJECT_STYLE_FILL_SERVER (item);
+ if (SP_IS_LINEARGRADIENT (server)) {
+ sp_item_set_gradient(item, gr, SP_GRADIENT_TYPE_LINEAR, true);
+ } else if (SP_IS_RADIALGRADIENT (server)) {
+ sp_item_set_gradient(item, gr, SP_GRADIENT_TYPE_RADIAL, true);
+ }
+ } else if (new_fill) {
+ sp_item_set_gradient(item, gr, new_type, true);
+ }
+ }
+
+ if (do_stroke) {
+ if (style && (style->stroke.type == SP_PAINT_TYPE_PAINTSERVER) &&
+ SP_IS_GRADIENT (SP_OBJECT_STYLE_STROKE_SERVER (item))) {
+ SPObject *server = SP_OBJECT_STYLE_STROKE_SERVER (item);
+ if (SP_IS_LINEARGRADIENT (server)) {
+ sp_item_set_gradient(item, gr, SP_GRADIENT_TYPE_LINEAR, false);
+ } else if (SP_IS_RADIALGRADIENT (server)) {
+ sp_item_set_gradient(item, gr, SP_GRADIENT_TYPE_RADIAL, false);
+ }
+ } else if (!new_fill) {
+ sp_item_set_gradient(item, gr, new_type, false);
+ }
+ }
+}
+
+/**
+Applies gradient vector gr to the gradients attached to the selected dragger of drag, or if none,
+to all objects in selection. If there was no previous gradient on an item, uses gradient type and
+fill/stroke setting from preferences to create new default (linear: left/right; radial: centered)
+gradient.
+*/
+void
+gr_apply_gradient (Inkscape::Selection *selection, GrDrag *drag, SPGradient *gr)
+{
+ SPGradientType new_type = (SPGradientType) prefs_get_int_attribute ("tools.gradient", "newgradient", SP_GRADIENT_TYPE_LINEAR);
+ guint new_fill = prefs_get_int_attribute ("tools.gradient", "newfillorstroke", 1);
+
+ // First try selected dragger
+ if (drag && drag->selected) {
+ GrDragger *dragger = drag->selected;
+ for (GSList const* i = dragger->draggables; i != NULL; i = i->next) { // for all draggables of dragger
+ GrDraggable *draggable = (GrDraggable *) i->data;
+ gr_apply_gradient_to_item (draggable->item, gr, new_type, new_fill, draggable->fill_or_stroke, !draggable->fill_or_stroke);
+ }
+ return;
+ }
+
+ // If no drag or no dragger selected, act on selection
+ for (GSList const* i = selection->itemList(); i != NULL; i = i->next) {
+ gr_apply_gradient_to_item (SP_ITEM(i->data), gr, new_type, new_fill, true, true);
+ }
+}
+
+void
+gr_item_activate (GtkMenuItem *menuitem, gpointer data)
+{
+ SPGradient *gr = (SPGradient *) g_object_get_data (G_OBJECT (menuitem), "gradient");
+ gr = sp_gradient_ensure_vector_normalized(gr);
+
+ SPDesktop *desktop = (SPDesktop *) data;
+ Inkscape::Selection *selection = SP_DT_SELECTION (desktop);
+ SPEventContext *ev = SP_DT_EVENTCONTEXT (desktop);
+
+ gr_apply_gradient (selection, ev? ev->get_drag() : NULL, gr);
+
+ sp_document_done (SP_DT_DOCUMENT (desktop));
+}
+
+gchar *
+gr_prepare_label (SPObject *obj)
+{
+ const gchar *id = obj->defaultLabel();
+ if (strlen(id) > 15 && (!strncmp (id, "#linearGradient", 15) || !strncmp (id, "#radialGradient", 15)))
+ return g_strdup_printf ("<small>#%s</small>", id+15);
+ return g_strdup_printf ("<small>%s</small>", id);
+}
+
+GtkWidget *
+gr_vector_list (SPDesktop *desktop, bool selection_empty, SPGradient *gr_selected, bool gr_multi)
+{
+ SPDocument *document = SP_DT_DOCUMENT (desktop);
+
+ GtkWidget *om = gtk_option_menu_new ();
+ GtkWidget *m = gtk_menu_new ();
+
+ GSList *gl = NULL;
+ const GSList *gradients = sp_document_get_resource_list (document, "gradient");
+ for (const GSList *i = gradients; i != NULL; i = i->next) {
+ if (SP_GRADIENT_HAS_STOPS (i->data)) {
+ gl = g_slist_prepend (gl, i->data);
+ }
+ }
+ gl = g_slist_reverse (gl);
+
+ guint pos = 0;
+ guint idx = 0;
+
+ if (!gl) {
+ GtkWidget *l = gtk_label_new("");
+ gtk_label_set_markup (GTK_LABEL(l), _("<small>No gradients</small>"));
+ GtkWidget *i = gtk_menu_item_new ();
+ gtk_container_add (GTK_CONTAINER (i), l);
+
+ gtk_widget_show (i);
+ gtk_menu_append (GTK_MENU (m), i);
+ gtk_widget_set_sensitive (om, FALSE);
+ } else if (selection_empty) {
+ GtkWidget *l = gtk_label_new("");
+ gtk_label_set_markup (GTK_LABEL(l), _("<small>Nothing selected</small>"));
+ GtkWidget *i = gtk_menu_item_new ();
+ gtk_container_add (GTK_CONTAINER (i), l);
+
+ gtk_widget_show (i);
+ gtk_menu_append (GTK_MENU (m), i);
+ gtk_widget_set_sensitive (om, FALSE);
+ } else {
+
+ if (gr_selected == NULL) {
+ GtkWidget *l = gtk_label_new("");
+ gtk_label_set_markup (GTK_LABEL(l), _("<small>No gradients in selection</small>"));
+ GtkWidget *i = gtk_menu_item_new ();
+ gtk_container_add (GTK_CONTAINER (i), l);
+
+ gtk_widget_show (i);
+ gtk_menu_append (GTK_MENU (m), i);
+ }
+
+ if (gr_multi) {
+ GtkWidget *l = gtk_label_new("");
+ gtk_label_set_markup (GTK_LABEL(l), _("<small>Multiple gradients</small>"));
+ GtkWidget *i = gtk_menu_item_new ();
+ gtk_container_add (GTK_CONTAINER (i), l);
+
+ gtk_widget_show (i);
+ gtk_menu_append (GTK_MENU (m), i);
+ }
+
+ while (gl) {
+ SPGradient *gradient = SP_GRADIENT (gl->data);
+ gl = g_slist_remove (gl, gradient);
+
+ GtkWidget *i = gtk_menu_item_new ();
+ g_object_set_data (G_OBJECT (i), "gradient", gradient);
+ g_signal_connect (G_OBJECT (i), "activate", G_CALLBACK (gr_item_activate), desktop);
+
+ GtkWidget *image = sp_gradient_image_new (gradient);
+
+ GtkWidget *hb = gtk_hbox_new (FALSE, 4);
+ GtkWidget *l = gtk_label_new ("");
+ gchar *label = gr_prepare_label (SP_OBJECT(gradient));
+ gtk_label_set_markup (GTK_LABEL(l), label);
+ g_free (label);
+ gtk_misc_set_alignment (GTK_MISC (l), 1.0, 0.5);
+ gtk_box_pack_start (GTK_BOX (hb), l, TRUE, TRUE, 0);
+ gtk_box_pack_start (GTK_BOX (hb), image, FALSE, FALSE, 0);
+
+ gtk_widget_show_all (i);
+
+ gtk_container_add (GTK_CONTAINER (i), hb);
+
+ gtk_menu_append (GTK_MENU (m), i);
+
+ if (gradient == gr_selected) {
+ pos = idx;
+ }
+ idx ++;
+ }
+ gtk_widget_set_sensitive (om, TRUE);
+ }
+
+ gtk_option_menu_set_menu (GTK_OPTION_MENU (om), m);
+ /* Select the current gradient, or the Multi/Nothing line */
+ if (gr_multi || gr_selected == NULL)
+ gtk_option_menu_set_history (GTK_OPTION_MENU (om), 0);
+ else
+ gtk_option_menu_set_history (GTK_OPTION_MENU (om), pos);
+
+ return om;
+}
+
+
+void
+gr_read_selection (Inkscape::Selection *selection, GrDrag *drag, SPGradient **gr_selected, bool *gr_multi, SPGradientSpread *spr_selected, bool *spr_multi)
+{
+ if (drag && drag->selected) {
+ GrDragger *dragger = drag->selected;
+ for (GSList const* i = dragger->draggables; i != NULL; i = i->next) { // for all draggables of dragger
+ GrDraggable *draggable = (GrDraggable *) i->data;
+ SPGradient *gradient = sp_item_gradient_get_vector (draggable->item, draggable->fill_or_stroke);
+ SPGradientSpread spread = sp_item_gradient_get_spread (draggable->item, draggable->fill_or_stroke);
+
+ if (gradient != *gr_selected) {
+ if (*gr_selected != NULL) {
+ *gr_multi = true;
+ } else {
+ *gr_selected = gradient;
+ }
+ }
+ if (spread != *spr_selected) {
+ if (*spr_selected != INT_MAX) {
+ *spr_multi = true;
+ } else {
+ *spr_selected = spread;
+ }
+ }
+ }
+ return;
+ }
+
+ // If no selected dragger, read desktop selection
+ for (GSList const* i = selection->itemList(); i != NULL; i = i->next) {
+ SPItem *item = SP_ITEM(i->data);
+ SPStyle *style = SP_OBJECT_STYLE (item);
+
+ if (style && (style->fill.type == SP_PAINT_TYPE_PAINTSERVER)) {
+ SPObject *server = SP_OBJECT_STYLE_FILL_SERVER (item);
+ if (SP_IS_GRADIENT (server)) {
+ SPGradient *gradient = sp_gradient_get_vector (SP_GRADIENT (server), false);
+ SPGradientSpread spread = sp_gradient_get_spread (SP_GRADIENT (server));
+ if (gradient != *gr_selected) {
+ if (*gr_selected != NULL) {
+ *gr_multi = true;
+ } else {
+ *gr_selected = gradient;
+ }
+ }
+ if (spread != *spr_selected) {
+ if (*spr_selected != INT_MAX) {
+ *spr_multi = true;
+ } else {
+ *spr_selected = spread;
+ }
+ }
+ }
+ }
+ if (style && (style->stroke.type == SP_PAINT_TYPE_PAINTSERVER)) {
+ SPObject *server = SP_OBJECT_STYLE_STROKE_SERVER (item);
+ if (SP_IS_GRADIENT (server)) {
+ SPGradient *gradient = sp_gradient_get_vector (SP_GRADIENT (server), false);
+ SPGradientSpread spread = sp_gradient_get_spread (SP_GRADIENT (server));
+ if (gradient != *gr_selected) {
+ if (*gr_selected != NULL) {
+ *gr_multi = true;
+ } else {
+ *gr_selected = gradient;
+ }
+ }
+ if (spread != *spr_selected) {
+ if (*spr_selected != INT_MAX) {
+ *spr_multi = true;
+ } else {
+ *spr_selected = spread;
+ }
+ }
+ }
+ }
+ }
+ }
+
+static void
+gr_tb_selection_changed (Inkscape::Selection *, gpointer data)
+{
+ GtkWidget *widget = (GtkWidget *) data;
+
+ SPDesktop *desktop = (SPDesktop *) g_object_get_data (G_OBJECT(widget), "desktop");
+ if (!desktop)
+ return;
+
+ Inkscape::Selection *selection = SP_DT_SELECTION (desktop); // take from desktop, not from args
+ if (!selection)
+ return;
+
+ SPEventContext *ev = SP_DT_EVENTCONTEXT (desktop);
+
+ GtkWidget *om = (GtkWidget *) g_object_get_data (G_OBJECT (widget), "menu");
+ if (om) gtk_widget_destroy (om);
+
+ SPGradient *gr_selected = NULL;
+ bool gr_multi = false;
+
+ SPGradientSpread spr_selected = (SPGradientSpread) INT_MAX; // meaning undefined
+ bool spr_multi = false;
+
+ gr_read_selection (selection, ev? ev->get_drag() : NULL, &gr_selected, &gr_multi, &spr_selected, &spr_multi);
+
+ om = gr_vector_list (desktop, selection->isEmpty(), gr_selected, gr_multi);
+ g_object_set_data (G_OBJECT (widget), "menu", om);
+
+ GtkWidget *buttons = (GtkWidget *) g_object_get_data (G_OBJECT(widget), "buttons");
+ gtk_widget_set_sensitive (buttons, (gr_selected && !gr_multi));
+
+ gtk_box_pack_start (GTK_BOX (widget), om, TRUE, TRUE, 0);
+
+ gtk_widget_show_all (widget);
+}
+
+static void
+gr_tb_selection_modified (Inkscape::Selection *selection, guint flags, gpointer data)
+{
+ gr_tb_selection_changed (selection, data);
+}
+
+static void
+gr_drag_selection_changed (gpointer dragger, gpointer data)
+{
+ gr_tb_selection_changed (NULL, data);
+}
+
+static void
+gr_defs_release (SPObject *defs, GtkWidget *widget)
+{
+ gr_tb_selection_changed (NULL, (gpointer) widget);
+}
+
+static void
+gr_defs_modified (SPObject *defs, guint flags, GtkWidget *widget)
+{
+ gr_tb_selection_changed (NULL, (gpointer) widget);
+}
+
+static void
+gr_fork (GtkWidget *button, GtkWidget *widget)
+{
+ SPDesktop *desktop = (SPDesktop *) g_object_get_data (G_OBJECT(widget), "desktop");
+ SPDocument *document = SP_DT_DOCUMENT (desktop);
+ Inkscape::Selection *selection = SP_DT_SELECTION (desktop);
+ SPEventContext *ev = SP_DT_EVENTCONTEXT (desktop);
+ GtkWidget *om = (GtkWidget *) g_object_get_data (G_OBJECT(widget), "menu");
+
+ if (om && document) {
+ GtkWidget *i = gtk_menu_get_active (GTK_MENU (gtk_option_menu_get_menu (GTK_OPTION_MENU (om))));
+ SPGradient *gr = (SPGradient *) g_object_get_data (G_OBJECT(i), "gradient");
+
+ if (gr) {
+ SPGradient *gr_new = sp_gradient_fork_vector_if_necessary (gr);
+ if (gr_new != gr) {
+ gr_apply_gradient (selection, ev? ev->get_drag() : NULL, gr_new);
+ sp_document_done (document);
+ }
+ }
+ }
+
+ spinbutton_defocus(GTK_OBJECT(widget));
+}
+
+static void gr_disconnect_sigc (GObject *obj, sigc::connection *connection) {
+ connection->disconnect();
+ delete connection;
+}
+
+static void gr_disconnect_gsignal (GObject *widget, gpointer defs) {
+ if (defs && G_IS_OBJECT(defs))
+ sp_signal_disconnect_by_data (defs, widget);
+}
+
+
+static void
+gr_edit (GtkWidget *button, GtkWidget *widget)
+{
+ GtkWidget *om = (GtkWidget *) g_object_get_data (G_OBJECT(widget), "menu");
+
+ spinbutton_defocus(GTK_OBJECT(widget));
+
+ if (om) {
+ GtkWidget *i = gtk_menu_get_active (GTK_MENU (gtk_option_menu_get_menu (GTK_OPTION_MENU (om))));
+ SPGradient *gr = (SPGradient *) g_object_get_data (G_OBJECT(i), "gradient");
+
+ if (gr) {
+ GtkWidget *dialog = sp_gradient_vector_editor_new (gr);
+ gtk_widget_show (dialog);
+ }
+ }
+}
+
+GtkWidget *
+gr_change_widget (SPDesktop *desktop)
+{
+ Inkscape::Selection *selection = SP_DT_SELECTION (desktop);
+ SPDocument *document = SP_DT_DOCUMENT (desktop);
+ SPEventContext *ev = SP_DT_EVENTCONTEXT (desktop);
+
+ SPGradient *gr_selected = NULL;
+ bool gr_multi = false;
+
+ SPGradientSpread spr_selected = (SPGradientSpread) INT_MAX; // meaning undefined
+ bool spr_multi = false;
+
+ GtkTooltips *tt = gtk_tooltips_new();
+
+ gr_read_selection (selection, ev? ev->get_drag() : NULL, &gr_selected, &gr_multi, &spr_selected, &spr_multi);
+
+ GtkWidget *widget = gtk_hbox_new(FALSE, FALSE);
+ gtk_object_set_data(GTK_OBJECT(widget), "dtw", desktop->canvas);
+ g_object_set_data (G_OBJECT (widget), "desktop", desktop);
+
+ GtkWidget *om = gr_vector_list (desktop, selection->isEmpty(), gr_selected, gr_multi);
+ g_object_set_data (G_OBJECT (widget), "menu", om);
+
+ gtk_box_pack_start (GTK_BOX (widget), om, TRUE, TRUE, 0);
+
+ {
+ GtkWidget *buttons = gtk_hbox_new(FALSE, 1);
+
+ /* Fork */
+ {
+ GtkWidget *hb = gtk_hbox_new(FALSE, 1);
+ GtkWidget *b = gtk_button_new_with_label(_("Duplicate"));
+ gtk_tooltips_set_tip(tt, b, _("If the gradient is used by more than one object, create a copy of it for the selected object(s)"), NULL);
+ gtk_widget_show(b);
+ gtk_container_add(GTK_CONTAINER(hb), b);
+ gtk_signal_connect(GTK_OBJECT(b), "clicked", GTK_SIGNAL_FUNC(gr_fork), widget);
+ gtk_box_pack_start (GTK_BOX(buttons), hb, FALSE, FALSE, 0);
+ }
+
+ /* Edit... */
+ {
+ GtkWidget *hb = gtk_hbox_new(FALSE, 1);
+ GtkWidget *b = gtk_button_new_with_label(_("Edit..."));
+ gtk_tooltips_set_tip(tt, b, _("Edit the stops of the gradient"), NULL);
+ gtk_widget_show(b);
+ gtk_container_add(GTK_CONTAINER(hb), b);
+ gtk_signal_connect(GTK_OBJECT(b), "clicked", GTK_SIGNAL_FUNC(gr_edit), widget);
+ gtk_box_pack_start (GTK_BOX(buttons), hb, FALSE, FALSE, 0);
+ }
+
+ gtk_box_pack_end (GTK_BOX(widget), buttons, FALSE, FALSE, 0);
+ g_object_set_data (G_OBJECT(widget), "buttons", buttons);
+ gtk_widget_set_sensitive (buttons, (gr_selected && !gr_multi));
+ }
+
+ // connect to selection modified and changed signals
+ sigc::connection *conn1 = new sigc::connection (selection->connectChanged(
+ sigc::bind (
+ sigc::ptr_fun(&gr_tb_selection_changed),
+ (gpointer)widget )
+ ));
+ sigc::connection *conn2 = new sigc::connection (selection->connectModified(
+ sigc::bind (
+ sigc::ptr_fun(&gr_tb_selection_modified),
+ (gpointer)widget )
+ ));
+
+ sigc::connection *conn3 = new sigc::connection (desktop->connectToolSubselectionChanged(
+ sigc::bind (
+ sigc::ptr_fun(&gr_drag_selection_changed),
+ (gpointer)widget )
+ ));
+
+ // when widget is destroyed, disconnect
+ g_signal_connect(G_OBJECT(widget), "destroy", G_CALLBACK(gr_disconnect_sigc), conn1);
+ g_signal_connect(G_OBJECT(widget), "destroy", G_CALLBACK(gr_disconnect_sigc), conn2);
+ g_signal_connect(G_OBJECT(widget), "destroy", G_CALLBACK(gr_disconnect_sigc), conn3);
+
+ // connect to release and modified signals of the defs (i.e. when someone changes gradient)
+ g_signal_connect (G_OBJECT (SP_DOCUMENT_DEFS (document)), "release", G_CALLBACK (gr_defs_release), widget);
+ g_signal_connect (G_OBJECT (SP_DOCUMENT_DEFS (document)), "modified", G_CALLBACK (gr_defs_modified), widget);
+
+ // when widget is destroyed, disconnect
+ g_signal_connect(G_OBJECT(widget), "destroy", G_CALLBACK(gr_disconnect_gsignal), G_OBJECT (SP_DOCUMENT_DEFS (document)));
+ g_signal_connect(G_OBJECT(widget), "destroy", G_CALLBACK(gr_disconnect_gsignal), G_OBJECT (SP_DOCUMENT_DEFS (document)));
+
+ gtk_widget_show_all (widget);
+ return widget;
+}
+
+GtkWidget *
+sp_gradient_toolbox_new(SPDesktop *desktop)
+{
+ GtkWidget *tbl = gtk_hbox_new(FALSE, 0);
+
+ gtk_object_set_data(GTK_OBJECT(tbl), "dtw", desktop->canvas);
+ gtk_object_set_data(GTK_OBJECT(tbl), "desktop", desktop);
+
+ GtkTooltips *tt = gtk_tooltips_new();
+
+ sp_toolbox_add_label(tbl, _("<b>New:</b>"));
+
+ aux_toolbox_space(tbl, AUX_SPACING);
+
+ {
+ GtkWidget *cvbox = gtk_vbox_new (FALSE, 0);
+ GtkWidget *cbox = gtk_hbox_new (FALSE, 0);
+
+ {
+ GtkWidget *button = sp_button_new_from_data( GTK_ICON_SIZE_SMALL_TOOLBAR,
+ SP_BUTTON_TYPE_TOGGLE,
+ NULL,
+ "fill_gradient",
+ _("Create linear gradient"),
+ tt);
+ g_signal_connect_after (G_OBJECT (button), "clicked", G_CALLBACK (gr_toggle_type), tbl);
+ g_object_set_data(G_OBJECT(tbl), "linear", button);
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button),
+ prefs_get_int_attribute ("tools.gradient", "newgradient", SP_GRADIENT_TYPE_LINEAR) == SP_GRADIENT_TYPE_LINEAR);
+ gtk_box_pack_start(GTK_BOX(cbox), button, FALSE, FALSE, 0);
+ }
+
+ {
+ GtkWidget *button = sp_button_new_from_data( GTK_ICON_SIZE_SMALL_TOOLBAR,
+ SP_BUTTON_TYPE_TOGGLE,
+ NULL,
+ "fill_radial",
+ _("Create radial (elliptic or circular) gradient"),
+ tt);
+ g_signal_connect_after (G_OBJECT (button), "clicked", G_CALLBACK (gr_toggle_type), tbl);
+ g_object_set_data(G_OBJECT(tbl), "radial", button);
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button),
+ prefs_get_int_attribute ("tools.gradient", "newgradient", SP_GRADIENT_TYPE_LINEAR) == SP_GRADIENT_TYPE_RADIAL);
+ gtk_box_pack_start(GTK_BOX(cbox), button, FALSE, FALSE, 0);
+ }
+
+ gtk_box_pack_start(GTK_BOX(cvbox), cbox, TRUE, FALSE, 0);
+ gtk_box_pack_start(GTK_BOX(tbl), cvbox, FALSE, FALSE, 0);
+ }
+
+ aux_toolbox_space(tbl, AUX_SPACING);
+
+ sp_toolbox_add_label(tbl, _("on"), false);
+
+ aux_toolbox_space(tbl, AUX_SPACING);
+
+ {
+ GtkWidget *cvbox = gtk_vbox_new (FALSE, 0);
+ GtkWidget *cbox = gtk_hbox_new (FALSE, 0);
+
+ {
+ GtkWidget *button = sp_button_new_from_data( GTK_ICON_SIZE_SMALL_TOOLBAR,
+ SP_BUTTON_TYPE_TOGGLE,
+ NULL,
+ "controls_fill",
+ _("Create gradient in the fill"),
+ tt);
+ g_signal_connect_after (G_OBJECT (button), "clicked", G_CALLBACK (gr_toggle_fillstroke), tbl);
+ g_object_set_data(G_OBJECT(tbl), "fill", button);
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button),
+ prefs_get_int_attribute ("tools.gradient", "newfillorstroke", 1) == 1);
+ gtk_box_pack_start(GTK_BOX(cbox), button, FALSE, FALSE, 0);
+ }
+
+ {
+ GtkWidget *button = sp_button_new_from_data( GTK_ICON_SIZE_SMALL_TOOLBAR,
+ SP_BUTTON_TYPE_TOGGLE,
+ NULL,
+ "controls_stroke",
+ _("Create gradient in the stroke"),
+ tt);
+ g_signal_connect_after (G_OBJECT (button), "clicked", G_CALLBACK (gr_toggle_fillstroke), tbl);
+ g_object_set_data(G_OBJECT(tbl), "stroke", button);
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button),
+ prefs_get_int_attribute ("tools.gradient", "newfillorstroke", 1) == 0);
+ gtk_box_pack_start(GTK_BOX(cbox), button, FALSE, FALSE, 0);
+ }
+
+ gtk_box_pack_start(GTK_BOX(cvbox), cbox, TRUE, TRUE, 3);
+ gtk_box_pack_start(GTK_BOX(tbl), cvbox, FALSE, FALSE, 0);
+ }
+
+
+ sp_toolbox_add_label(tbl, _("<b>Change:</b>"));
+
+ aux_toolbox_space(tbl, AUX_SPACING);
+
+ {
+ GtkWidget *vectors = gr_change_widget (desktop);
+ gtk_box_pack_start (GTK_BOX (tbl), vectors, FALSE, FALSE, 0);
+ }
+
+ gtk_widget_show_all(tbl);
+ sp_set_font_size_smaller (tbl);
+
+ return tbl;
+}
+
+
+
+
+/*
+ Local Variables:
+ mode:c++
+ c-file-style:"stroustrup"
+ c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
+ indent-tabs-mode:nil
+ fill-column:99
+ End:
+*/
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4 :