index 0091fb3c95ed826fd87a8b6443fe314745aa2d5b..49549de1c51d49e19a7b26122e1b671757774f93 100644 (file)
-#define __SP_GRADIENT_SELECTOR_C__
-
/*
* Gradient vector widget
*
* Authors:
* Lauris Kaplinski <lauris@kaplinski.com>
* bulia byak <buliabyak@users.sf.net>
+ * Jon A. Cruz <jon@joncruz.org>
*
* Copyright (C) 2001-2002 Lauris Kaplinski
* Copyright (C) 2001 Ximian, Inc.
+ * Copyright (C) 2010 Jon A. Cruz
*
* Released under GNU GPL, read the file 'COPYING' for more information
*/
#include "gradient-selector.h"
enum {
- GRABBED,
- DRAGGED,
- RELEASED,
- CHANGED,
- LAST_SIGNAL
+ GRABBED,
+ DRAGGED,
+ RELEASED,
+ CHANGED,
+ LAST_SIGNAL
};
static void sp_gradient_selector_class_init (SPGradientSelectorClass *klass);
@@ -55,288 +55,318 @@ static void sp_gradient_selector_spread_activate (GtkWidget *widget, SPGradientS
static GtkVBoxClass *parent_class;
static guint signals[LAST_SIGNAL] = {0};
-GtkType
-sp_gradient_selector_get_type (void)
+GType sp_gradient_selector_get_type(void)
{
- static GtkType type = 0;
- if (!type) {
- GtkTypeInfo info = {
- "SPGradientSelector",
- sizeof (SPGradientSelector),
- sizeof (SPGradientSelectorClass),
- (GtkClassInitFunc) sp_gradient_selector_class_init,
- (GtkObjectInitFunc) sp_gradient_selector_init,
- NULL, NULL, NULL
- };
- type = gtk_type_unique (GTK_TYPE_VBOX, &info);
- }
- return type;
+ static GType type = 0;
+ if (!type) {
+ static const GTypeInfo info = {
+ sizeof(SPGradientSelectorClass),
+ NULL, /* base_init */
+ NULL, /* base_finalize */
+ (GClassInitFunc) sp_gradient_selector_class_init,
+ NULL, /* class_finalize */
+ NULL, /* class_data */
+ sizeof(SPGradientSelector),
+ 0, /* n_preallocs */
+ (GInstanceInitFunc) sp_gradient_selector_init,
+ 0, /* value_table */
+ };
+
+ type = g_type_register_static( GTK_TYPE_VBOX,
+ "SPGradientSelector",
+ &info,
+ static_cast< GTypeFlags > (0) );
+ }
+ return type;
}
static void
sp_gradient_selector_class_init (SPGradientSelectorClass *klass)
{
- GtkObjectClass *object_class;
-
- object_class = (GtkObjectClass *) klass;
-
- parent_class = (GtkVBoxClass*)gtk_type_class (GTK_TYPE_VBOX);
-
- signals[GRABBED] = gtk_signal_new ("grabbed",
- (GtkSignalRunType)(GTK_RUN_FIRST | GTK_RUN_NO_RECURSE),
- GTK_CLASS_TYPE(object_class),
- GTK_SIGNAL_OFFSET (SPGradientSelectorClass, grabbed),
- gtk_marshal_NONE__NONE,
- GTK_TYPE_NONE, 0);
- signals[DRAGGED] = gtk_signal_new ("dragged",
- (GtkSignalRunType)(GTK_RUN_FIRST | GTK_RUN_NO_RECURSE),
- GTK_CLASS_TYPE(object_class),
- GTK_SIGNAL_OFFSET (SPGradientSelectorClass, dragged),
- gtk_marshal_NONE__NONE,
- GTK_TYPE_NONE, 0);
- signals[RELEASED] = gtk_signal_new ("released",
- (GtkSignalRunType)(GTK_RUN_FIRST | GTK_RUN_NO_RECURSE),
- GTK_CLASS_TYPE(object_class),
- GTK_SIGNAL_OFFSET (SPGradientSelectorClass, released),
- gtk_marshal_NONE__NONE,
- GTK_TYPE_NONE, 0);
- signals[CHANGED] = gtk_signal_new ("changed",
- (GtkSignalRunType)(GTK_RUN_FIRST | GTK_RUN_NO_RECURSE),
- GTK_CLASS_TYPE(object_class),
- GTK_SIGNAL_OFFSET (SPGradientSelectorClass, changed),
- gtk_marshal_NONE__NONE,
- GTK_TYPE_NONE, 0);
-
- object_class->destroy = sp_gradient_selector_destroy;
+ GtkObjectClass *object_class;
+
+ object_class = (GtkObjectClass *) klass;
+
+ parent_class = (GtkVBoxClass*)gtk_type_class (GTK_TYPE_VBOX);
+
+ signals[GRABBED] = gtk_signal_new ("grabbed",
+ (GtkSignalRunType)(GTK_RUN_FIRST | GTK_RUN_NO_RECURSE),
+ GTK_CLASS_TYPE(object_class),
+ GTK_SIGNAL_OFFSET (SPGradientSelectorClass, grabbed),
+ gtk_marshal_NONE__NONE,
+ GTK_TYPE_NONE, 0);
+ signals[DRAGGED] = gtk_signal_new ("dragged",
+ (GtkSignalRunType)(GTK_RUN_FIRST | GTK_RUN_NO_RECURSE),
+ GTK_CLASS_TYPE(object_class),
+ GTK_SIGNAL_OFFSET (SPGradientSelectorClass, dragged),
+ gtk_marshal_NONE__NONE,
+ GTK_TYPE_NONE, 0);
+ signals[RELEASED] = gtk_signal_new ("released",
+ (GtkSignalRunType)(GTK_RUN_FIRST | GTK_RUN_NO_RECURSE),
+ GTK_CLASS_TYPE(object_class),
+ GTK_SIGNAL_OFFSET (SPGradientSelectorClass, released),
+ gtk_marshal_NONE__NONE,
+ GTK_TYPE_NONE, 0);
+ signals[CHANGED] = gtk_signal_new ("changed",
+ (GtkSignalRunType)(GTK_RUN_FIRST | GTK_RUN_NO_RECURSE),
+ GTK_CLASS_TYPE(object_class),
+ GTK_SIGNAL_OFFSET (SPGradientSelectorClass, changed),
+ gtk_marshal_NONE__NONE,
+ GTK_TYPE_NONE, 0);
+
+ object_class->destroy = sp_gradient_selector_destroy;
}
-static void
-sp_gradient_selector_init (SPGradientSelector *sel)
+static void sp_gradient_selector_init(SPGradientSelector *sel)
{
- GtkWidget *hb, *l, *m, *mi;
-
- sel->mode = SP_GRADIENT_SELECTOR_MODE_LINEAR;
-
- sel->gradientUnits = SP_GRADIENT_UNITS_USERSPACEONUSE;
- sel->gradientSpread = SP_GRADIENT_SPREAD_PAD;
-
- /* Vectors */
- sel->vectors = sp_gradient_vector_selector_new (NULL, NULL);
- gtk_widget_show (sel->vectors);
- gtk_box_pack_start (GTK_BOX (sel), sel->vectors, FALSE, FALSE, 0);
- g_signal_connect (G_OBJECT (sel->vectors), "vector_set", G_CALLBACK (sp_gradient_selector_vector_set), sel);
-
- /* Create box for buttons */
- hb = gtk_hbox_new (FALSE, 0);
- gtk_box_pack_start (GTK_BOX (sel), hb, FALSE, FALSE, 0);
- GtkTooltips *ttips = gtk_tooltips_new ();
-
- sel->add = gtk_button_new_with_label (_("Duplicate"));
- gtk_box_pack_start (GTK_BOX (hb), sel->add, TRUE, TRUE, 0);
- g_signal_connect (G_OBJECT (sel->add), "clicked", G_CALLBACK (sp_gradient_selector_add_vector_clicked), sel);
- gtk_widget_set_sensitive (sel->add, FALSE);
-
- sel->edit = gtk_button_new_with_label (_("Edit..."));
- gtk_box_pack_start (GTK_BOX (hb), sel->edit, TRUE, TRUE, 0);
- g_signal_connect (G_OBJECT (sel->edit), "clicked", G_CALLBACK (sp_gradient_selector_edit_vector_clicked), sel);
- gtk_widget_set_sensitive (sel->edit, FALSE);
-
- gtk_widget_show_all (hb);
-
- /* Spread selector */
- hb = gtk_hbox_new (FALSE, 0);
- gtk_widget_show (hb);
- gtk_box_pack_start (GTK_BOX (sel), hb, FALSE, FALSE, 0);
-
- sel->spread = gtk_option_menu_new ();
- gtk_widget_show (sel->spread);
- gtk_box_pack_end (GTK_BOX (hb), sel->spread, FALSE, FALSE, 0);
- gtk_tooltips_set_tip (ttips, sel->spread,
- // TRANSLATORS: for info, see http://www.w3.org/TR/2000/CR-SVG-20000802/pservers.html#LinearGradientSpreadMethodAttribute
- _("Whether to fill with flat color beyond the ends of the gradient vector "
- "(spreadMethod=\"pad\"), or repeat the gradient in the same direction "
- "(spreadMethod=\"repeat\"), or repeat the gradient in alternating opposite "
- "directions (spreadMethod=\"reflect\")"), NULL);
-
- m = gtk_menu_new ();
- mi = gtk_menu_item_new_with_label (_("none"));
- gtk_menu_append (GTK_MENU (m), mi);
- g_object_set_data (G_OBJECT (mi), "gradientSpread", GUINT_TO_POINTER (SP_GRADIENT_SPREAD_PAD));
- g_signal_connect (G_OBJECT (mi), "activate", G_CALLBACK (sp_gradient_selector_spread_activate), sel);
- mi = gtk_menu_item_new_with_label (_("reflected"));
- g_object_set_data (G_OBJECT (mi), "gradientSpread", GUINT_TO_POINTER (SP_GRADIENT_SPREAD_REFLECT));
- g_signal_connect (G_OBJECT (mi), "activate", G_CALLBACK (sp_gradient_selector_spread_activate), sel);
- gtk_menu_append (GTK_MENU (m), mi);
- mi = gtk_menu_item_new_with_label (_("direct"));
- g_object_set_data (G_OBJECT (mi), "gradientSpread", GUINT_TO_POINTER (SP_GRADIENT_SPREAD_REPEAT));
- g_signal_connect (G_OBJECT (mi), "activate", G_CALLBACK (sp_gradient_selector_spread_activate), sel);
- gtk_menu_append (GTK_MENU (m), mi);
- gtk_widget_show_all (m);
-
- gtk_option_menu_set_menu (GTK_OPTION_MENU (sel->spread), m);
-
- l = gtk_label_new (_("Repeat:"));
- gtk_widget_show (l);
- gtk_box_pack_end (GTK_BOX (hb), l, FALSE, FALSE, 4);
+ sel->safelyInit = true;
+ new (&sel->nonsolid) std::vector<GtkWidget*>();
+
+ sel->mode = SPGradientSelector::MODE_LINEAR;
+
+ sel->gradientUnits = SP_GRADIENT_UNITS_USERSPACEONUSE;
+ sel->gradientSpread = SP_GRADIENT_SPREAD_PAD;
+
+ /* Vectors */
+ sel->vectors = sp_gradient_vector_selector_new (NULL, NULL);
+ gtk_widget_show (sel->vectors);
+ gtk_box_pack_start (GTK_BOX (sel), sel->vectors, FALSE, FALSE, 0);
+ g_signal_connect (G_OBJECT (sel->vectors), "vector_set", G_CALLBACK (sp_gradient_selector_vector_set), sel);
+
+ /* Create box for buttons */
+ GtkWidget *hb = gtk_hbox_new( FALSE, 0 );
+ sel->nonsolid.push_back(hb);
+ gtk_box_pack_start( GTK_BOX(sel), hb, FALSE, FALSE, 0 );
+ GtkTooltips *ttips = gtk_tooltips_new ();
+
+ sel->add = gtk_button_new_with_label (_("Duplicate"));
+ sel->nonsolid.push_back(sel->add);
+ gtk_box_pack_start (GTK_BOX (hb), sel->add, TRUE, TRUE, 0);
+ g_signal_connect (G_OBJECT (sel->add), "clicked", G_CALLBACK (sp_gradient_selector_add_vector_clicked), sel);
+ gtk_widget_set_sensitive (sel->add, FALSE);
+
+ sel->edit = gtk_button_new_with_label (_("Edit..."));
+ sel->nonsolid.push_back(sel->edit);
+ gtk_box_pack_start (GTK_BOX (hb), sel->edit, TRUE, TRUE, 0);
+ g_signal_connect (G_OBJECT (sel->edit), "clicked", G_CALLBACK (sp_gradient_selector_edit_vector_clicked), sel);
+ gtk_widget_set_sensitive (sel->edit, FALSE);
+
+ gtk_widget_show_all(hb);
+
+ /* Spread selector */
+ hb = gtk_hbox_new( FALSE, 0 );
+ sel->nonsolid.push_back(hb);
+ gtk_widget_show(hb);
+ gtk_box_pack_start( GTK_BOX(sel), hb, FALSE, FALSE, 0 );
+
+ sel->spread = gtk_option_menu_new();
+ sel->nonsolid.push_back(sel->spread);
+ gtk_widget_show(sel->spread);
+ gtk_box_pack_end( GTK_BOX(hb), sel->spread, FALSE, FALSE, 0 );
+ gtk_tooltips_set_tip( ttips, sel->spread,
+ // TRANSLATORS: for info, see http://www.w3.org/TR/2000/CR-SVG-20000802/pservers.html#LinearGradientSpreadMethodAttribute
+ _("Whether to fill with flat color beyond the ends of the gradient vector "
+ "(spreadMethod=\"pad\"), or repeat the gradient in the same direction "
+ "(spreadMethod=\"repeat\"), or repeat the gradient in alternating opposite "
+ "directions (spreadMethod=\"reflect\")"), NULL);
+
+ GtkWidget *m = gtk_menu_new();
+ GtkWidget *mi = gtk_menu_item_new_with_label(_("none"));
+ gtk_menu_append (GTK_MENU (m), mi);
+ g_object_set_data (G_OBJECT (mi), "gradientSpread", GUINT_TO_POINTER (SP_GRADIENT_SPREAD_PAD));
+ g_signal_connect (G_OBJECT (mi), "activate", G_CALLBACK (sp_gradient_selector_spread_activate), sel);
+ mi = gtk_menu_item_new_with_label (_("reflected"));
+ g_object_set_data (G_OBJECT (mi), "gradientSpread", GUINT_TO_POINTER (SP_GRADIENT_SPREAD_REFLECT));
+ g_signal_connect (G_OBJECT (mi), "activate", G_CALLBACK (sp_gradient_selector_spread_activate), sel);
+ gtk_menu_append (GTK_MENU (m), mi);
+ mi = gtk_menu_item_new_with_label (_("direct"));
+ g_object_set_data (G_OBJECT (mi), "gradientSpread", GUINT_TO_POINTER (SP_GRADIENT_SPREAD_REPEAT));
+ g_signal_connect (G_OBJECT (mi), "activate", G_CALLBACK (sp_gradient_selector_spread_activate), sel);
+ gtk_menu_append (GTK_MENU (m), mi);
+ gtk_widget_show_all (m);
+
+ gtk_option_menu_set_menu( GTK_OPTION_MENU(sel->spread), m );
+
+ sel->spreadLbl = gtk_label_new( _("Repeat:") );
+ sel->nonsolid.push_back(sel->spreadLbl);
+ gtk_widget_show( sel->spreadLbl );
+ gtk_box_pack_end( GTK_BOX(hb), sel->spreadLbl, FALSE, FALSE, 4 );
}
-static void
-sp_gradient_selector_destroy (GtkObject *object)
+static void sp_gradient_selector_destroy(GtkObject *object)
{
- SPGradientSelector *sel;
+ SPGradientSelector *sel = SP_GRADIENT_SELECTOR( object );
- sel = SP_GRADIENT_SELECTOR (object);
+ if ( sel->safelyInit ) {
+ sel->safelyInit = false;
+ using std::vector;
+ sel->nonsolid.~vector<GtkWidget*>();
+ }
- if (((GtkObjectClass *) (parent_class))->destroy)
- (* ((GtkObjectClass *) (parent_class))->destroy) (object);
+ if (((GtkObjectClass *) (parent_class))->destroy) {
+ (* ((GtkObjectClass *) (parent_class))->destroy) (object);
+ }
}
GtkWidget *
sp_gradient_selector_new (void)
{
- SPGradientSelector *sel;
+ SPGradientSelector *sel;
- sel = (SPGradientSelector*)gtk_type_new (SP_TYPE_GRADIENT_SELECTOR);
+ sel = (SPGradientSelector*)gtk_type_new (SP_TYPE_GRADIENT_SELECTOR);
- return (GtkWidget *) sel;
+ return (GtkWidget *) sel;
}
-void
-sp_gradient_selector_set_mode (SPGradientSelector *sel, guint mode)
+void SPGradientSelector::setMode(SelectorMode mode)
{
- g_return_if_fail (sel != NULL);
- g_return_if_fail (SP_IS_GRADIENT_SELECTOR (sel));
-
- sel->mode = mode;
+ if (mode != this->mode) {
+ this->mode = mode;
+ if (mode == MODE_SWATCH) {
+ for (std::vector<GtkWidget*>::iterator it = nonsolid.begin(); it != nonsolid.end(); ++it)
+ {
+ gtk_widget_hide(*it);
+ }
+
+ SPGradientVectorSelector* vs = SP_GRADIENT_VECTOR_SELECTOR(vectors);
+ vs->setSwatched();
+ }
+ }
}
-void
-sp_gradient_selector_set_units (SPGradientSelector *sel, guint units)
+void SPGradientSelector::setUnits(SPGradientUnits units)
{
- g_return_if_fail (sel != NULL);
- g_return_if_fail (SP_IS_GRADIENT_SELECTOR (sel));
-
- sel->gradientUnits = (SPGradientUnits)units;
+ gradientUnits = units;
}
-void
-sp_gradient_selector_set_spread (SPGradientSelector *sel, guint spread)
+void SPGradientSelector::setSpread(SPGradientSpread spread)
{
- g_return_if_fail (sel != NULL);
- g_return_if_fail (SP_IS_GRADIENT_SELECTOR (sel));
-
- sel->gradientSpread = (SPGradientSpread)spread;
+ gradientSpread = spread;
- gtk_option_menu_set_history (GTK_OPTION_MENU (sel->spread), sel->gradientSpread);
+ gtk_option_menu_set_history(GTK_OPTION_MENU(this->spread), gradientSpread);
}
-SPGradientUnits
-sp_gradient_selector_get_units (SPGradientSelector *sel)
+SPGradientUnits SPGradientSelector::getUnits()
{
- return (SPGradientUnits) sel->gradientUnits;
+ return gradientUnits;
}
-SPGradientSpread
-sp_gradient_selector_get_spread (SPGradientSelector *sel)
+SPGradientSpread SPGradientSelector::getSpread()
{
- return (SPGradientSpread) sel->gradientSpread;
+ return gradientSpread;
}
-void
-sp_gradient_selector_set_vector (SPGradientSelector *sel, SPDocument *doc, SPGradient *vector)
+void SPGradientSelector::setVector(SPDocument *doc, SPGradient *vector)
{
- g_return_if_fail (sel != NULL);
- g_return_if_fail (SP_IS_GRADIENT_SELECTOR (sel));
- g_return_if_fail (!vector || SP_IS_GRADIENT (vector));
- g_return_if_fail (!vector || (SP_OBJECT_DOCUMENT (vector) == doc));
-
- if (vector && !SP_GRADIENT_HAS_STOPS (vector))
- return;
-
- sp_gradient_vector_selector_set_gradient (SP_GRADIENT_VECTOR_SELECTOR (sel->vectors), doc, vector);
-
- if (vector) {
- gtk_widget_set_sensitive (sel->edit, TRUE);
- gtk_widget_set_sensitive (sel->add, TRUE);
- } else {
- gtk_widget_set_sensitive (sel->edit, FALSE);
- gtk_widget_set_sensitive (sel->add, (doc != NULL));
- }
+ g_return_if_fail(!vector || SP_IS_GRADIENT(vector));
+ g_return_if_fail(!vector || (SP_OBJECT_DOCUMENT(vector) == doc));
+
+ if (vector && !vector->hasStops()) {
+ return;
+ }
+
+ sp_gradient_vector_selector_set_gradient(SP_GRADIENT_VECTOR_SELECTOR(vectors), doc, vector);
+
+ if (vector) {
+ if ( (mode == MODE_SWATCH) && vector->isSwatch() ) {
+ if ( vector->isSolid() ) {
+ for (std::vector<GtkWidget*>::iterator it = nonsolid.begin(); it != nonsolid.end(); ++it)
+ {
+ gtk_widget_hide(*it);
+ }
+ } else {
+ for (std::vector<GtkWidget*>::iterator it = nonsolid.begin(); it != nonsolid.end(); ++it)
+ {
+ gtk_widget_show_all(*it);
+ }
+ }
+ }
+
+ if (edit) {
+ gtk_widget_set_sensitive(edit, TRUE);
+ }
+ if (add) {
+ gtk_widget_set_sensitive(add, TRUE);
+ }
+ } else {
+ if (edit) {
+ gtk_widget_set_sensitive(edit, FALSE);
+ }
+ if (add) {
+ gtk_widget_set_sensitive(add, (doc != NULL));
+ }
+ }
}
-SPGradient *
-sp_gradient_selector_get_vector (SPGradientSelector *sel)
+SPGradient *SPGradientSelector::getVector()
{
- if (sel == NULL || !SP_IS_GRADIENT_SELECTOR (sel))
- return NULL;
-
- /* fixme: */
- return SP_GRADIENT_VECTOR_SELECTOR (sel->vectors)->gr;
+ /* fixme: */
+ return SP_GRADIENT_VECTOR_SELECTOR(vectors)->gr;
}
static void
-sp_gradient_selector_vector_set (SPGradientVectorSelector *gvs, SPGradient *gr, SPGradientSelector *sel)
+sp_gradient_selector_vector_set (SPGradientVectorSelector */*gvs*/, SPGradient *gr, SPGradientSelector *sel)
{
- static gboolean blocked = FALSE;
-
- if (!blocked) {
- blocked = TRUE;
- gr = sp_gradient_ensure_vector_normalized (gr);
- sp_gradient_selector_set_vector (sel, (gr) ? SP_OBJECT_DOCUMENT (gr) : NULL, gr);
- g_signal_emit (G_OBJECT (sel), signals[CHANGED], 0, gr);
- blocked = FALSE;
- }
+ static gboolean blocked = FALSE;
+
+ if (!blocked) {
+ blocked = TRUE;
+ gr = sp_gradient_ensure_vector_normalized (gr);
+ sel->setVector((gr) ? SP_OBJECT_DOCUMENT (gr) : 0, gr);
+ g_signal_emit (G_OBJECT (sel), signals[CHANGED], 0, gr);
+ blocked = FALSE;
+ }
}
static void
-sp_gradient_selector_edit_vector_clicked (GtkWidget *w, SPGradientSelector *sel)
+sp_gradient_selector_edit_vector_clicked (GtkWidget */*w*/, SPGradientSelector *sel)
{
- GtkWidget *dialog;
+ GtkWidget *dialog;
- /* fixme: */
- dialog = sp_gradient_vector_editor_new (SP_GRADIENT_VECTOR_SELECTOR (sel->vectors)->gr);
+ /* fixme: */
+ dialog = sp_gradient_vector_editor_new (SP_GRADIENT_VECTOR_SELECTOR (sel->vectors)->gr);
- gtk_widget_show (dialog);
+ gtk_widget_show (dialog);
}
static void
-sp_gradient_selector_add_vector_clicked (GtkWidget *w, SPGradientSelector *sel)
+sp_gradient_selector_add_vector_clicked (GtkWidget */*w*/, SPGradientSelector *sel)
{
- SPDocument *doc = sp_gradient_vector_selector_get_document (
- SP_GRADIENT_VECTOR_SELECTOR (sel->vectors));
+ SPDocument *doc = sp_gradient_vector_selector_get_document (
+ SP_GRADIENT_VECTOR_SELECTOR (sel->vectors));
- if (!doc)
+ if (!doc)
return;
- SPGradient *gr = sp_gradient_vector_selector_get_gradient(
- SP_GRADIENT_VECTOR_SELECTOR (sel->vectors));
- Inkscape::XML::Document *xml_doc = sp_document_repr_doc(doc);
-
- Inkscape::XML::Node *repr = NULL;
-
- if (gr)
- repr = SP_OBJECT_REPR (gr)->duplicate(xml_doc);
- else {
- repr = xml_doc->createElement("svg:linearGradient");
- Inkscape::XML::Node *stop = xml_doc->createElement("svg:stop");
- stop->setAttribute("offset", "0");
- stop->setAttribute("style", "stop-color:#000;stop-opacity:1;");
- repr->appendChild(stop);
- Inkscape::GC::release(stop);
- stop = xml_doc->createElement("svg:stop");
- stop->setAttribute("offset", "1");
- stop->setAttribute("style", "stop-color:#fff;stop-opacity:1;");
- repr->appendChild(stop);
- Inkscape::GC::release(stop);
- }
-
- SP_OBJECT_REPR (SP_DOCUMENT_DEFS (doc))->addChild(repr, NULL);
-
- gr = (SPGradient *) doc->getObjectByRepr(repr);
- sp_gradient_vector_selector_set_gradient(
- SP_GRADIENT_VECTOR_SELECTOR (sel->vectors), doc, gr);
-
- Inkscape::GC::release(repr);
+ SPGradient *gr = sp_gradient_vector_selector_get_gradient(
+ SP_GRADIENT_VECTOR_SELECTOR (sel->vectors));
+ Inkscape::XML::Document *xml_doc = doc->getReprDoc();
+
+ Inkscape::XML::Node *repr = NULL;
+
+ if (gr)
+ repr = SP_OBJECT_REPR (gr)->duplicate(xml_doc);
+ else {
+ repr = xml_doc->createElement("svg:linearGradient");
+ Inkscape::XML::Node *stop = xml_doc->createElement("svg:stop");
+ stop->setAttribute("offset", "0");
+ stop->setAttribute("style", "stop-color:#000;stop-opacity:1;");
+ repr->appendChild(stop);
+ Inkscape::GC::release(stop);
+ stop = xml_doc->createElement("svg:stop");
+ stop->setAttribute("offset", "1");
+ stop->setAttribute("style", "stop-color:#fff;stop-opacity:1;");
+ repr->appendChild(stop);
+ Inkscape::GC::release(stop);
+ }
+
+ SP_OBJECT_REPR (SP_DOCUMENT_DEFS (doc))->addChild(repr, NULL);
+
+ gr = (SPGradient *) doc->getObjectByRepr(repr);
+ sp_gradient_vector_selector_set_gradient(
+ SP_GRADIENT_VECTOR_SELECTOR (sel->vectors), doc, gr);
+
+ Inkscape::GC::release(repr);
}
@@ -344,7 +374,19 @@ sp_gradient_selector_add_vector_clicked (GtkWidget *w, SPGradientSelector *sel)
static void
sp_gradient_selector_spread_activate (GtkWidget *widget, SPGradientSelector *sel)
{
- sel->gradientSpread = (SPGradientSpread)GPOINTER_TO_UINT (g_object_get_data (G_OBJECT (widget), "gradientSpread"));
+ sel->gradientSpread = (SPGradientSpread)GPOINTER_TO_UINT (g_object_get_data (G_OBJECT (widget), "gradientSpread"));
- g_signal_emit (G_OBJECT (sel), signals[CHANGED], 0);
+ g_signal_emit (G_OBJECT (sel), signals[CHANGED], 0);
}
+
+
+/*
+ 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 :