paint-selector.cpp revision 32dbfdf82f6abb93aeed3f0d1cf66a2cf62164aa
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler * SPPaintSelector: Generic paint selector widget.
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler * Lauris Kaplinski
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler * bulia byak <buliabyak@users.sf.net>
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler * John Cliff <simarilius@yahoo.com>
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler * Jon A. Cruz <jon@joncruz.org>
e4369b05aaa20df73a37f4d319ce456865cc74f3Krzysztof Kosiński * Abhishek Sharma
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler * Copyright (C) Lauris Kaplinski 2002
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler * Copyright (C) 2010 Authors
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler/* fixme: Move it from dialogs to here */
e4369b05aaa20df73a37f4d319ce456865cc74f3Krzysztof Kosiński#endif // SP_PS_VERBOSE
e4369b05aaa20df73a37f4d319ce456865cc74f3Krzysztof Kosińskistatic void sp_paint_selector_class_init(SPPaintSelectorClass *klass);
f6df6236fcf18524e049bba12b69704af32eff90Josh Andlerstatic void sp_paint_selector_init(SPPaintSelector *slider);
f6df6236fcf18524e049bba12b69704af32eff90Josh Andlerstatic void sp_paint_selector_destroy(GtkObject *object);
f6df6236fcf18524e049bba12b69704af32eff90Josh Andlerstatic GtkWidget *sp_paint_selector_style_button_add(SPPaintSelector *psel, gchar const *px, SPPaintSelector::Mode mode, gchar const *tip);
f6df6236fcf18524e049bba12b69704af32eff90Josh Andlerstatic void sp_paint_selector_style_button_toggled(GtkToggleButton *tb, SPPaintSelector *psel);
f6df6236fcf18524e049bba12b69704af32eff90Josh Andlerstatic void sp_paint_selector_fillrule_toggled(GtkToggleButton *tb, SPPaintSelector *psel);
f6df6236fcf18524e049bba12b69704af32eff90Josh Andlerstatic void sp_paint_selector_set_mode_empty(SPPaintSelector *psel);
e4369b05aaa20df73a37f4d319ce456865cc74f3Krzysztof Kosińskistatic void sp_paint_selector_set_mode_multiple(SPPaintSelector *psel);
e4369b05aaa20df73a37f4d319ce456865cc74f3Krzysztof Kosińskistatic void sp_paint_selector_set_mode_none(SPPaintSelector *psel);
e4369b05aaa20df73a37f4d319ce456865cc74f3Krzysztof Kosińskistatic void sp_paint_selector_set_mode_color(SPPaintSelector *psel, SPPaintSelector::Mode mode);
f6df6236fcf18524e049bba12b69704af32eff90Josh Andlerstatic void sp_paint_selector_set_mode_gradient(SPPaintSelector *psel, SPPaintSelector::Mode mode);
f6df6236fcf18524e049bba12b69704af32eff90Josh Andlerstatic void sp_paint_selector_set_mode_pattern(SPPaintSelector *psel, SPPaintSelector::Mode mode);
f6df6236fcf18524e049bba12b69704af32eff90Josh Andlerstatic void sp_paint_selector_set_mode_swatch(SPPaintSelector *psel, SPPaintSelector::Mode mode);
f6df6236fcf18524e049bba12b69704af32eff90Josh Andlerstatic void sp_paint_selector_set_mode_unset(SPPaintSelector *psel);
f6df6236fcf18524e049bba12b69704af32eff90Josh Andlerstatic void sp_paint_selector_set_style_buttons(SPPaintSelector *psel, GtkWidget *active);
e4369b05aaa20df73a37f4d319ce456865cc74f3Krzysztof Kosińskistatic guint psel_signals[LAST_SIGNAL] = {0};
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler "MODE_EMPTY",
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler "MODE_MULTIPLE",
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler "MODE_NONE",
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler "MODE_COLOR_RGB",
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler "MODE_COLOR_CMYK",
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler "MODE_GRADIENT_LINEAR",
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler "MODE_GRADIENT_RADIAL",
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler "MODE_PATTERN",
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler "MODE_SWATCH",
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler "MODE_UNSET",
f6df6236fcf18524e049bba12b69704af32eff90Josh Andlerstatic bool isPaintModeGradient( SPPaintSelector::Mode mode )
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler bool isGrad = (mode == SPPaintSelector::MODE_GRADIENT_LINEAR) ||
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler (mode == SPPaintSelector::MODE_GRADIENT_RADIAL) ||
f6df6236fcf18524e049bba12b69704af32eff90Josh Andlerstatic SPGradientSelector *getGradientFromData(SPPaintSelector const *psel)
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler if (psel->mode == SPPaintSelector::MODE_SWATCH) {
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler SwatchSelector *swatchsel = static_cast<SwatchSelector*>(g_object_get_data(G_OBJECT(psel->selector), "swatch-selector"));
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler grad = reinterpret_cast<SPGradientSelector*>(gtk_object_get_data(GTK_OBJECT(psel->selector), "gradient-selector"));
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler 0, // base_init
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler 0, // base_finalize
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler 0, // class_finalize
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler 0, // class_data
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler 0, // n_preallocs
7bda77e763c0af49270427593108b66455dfd125Krzysztof Kosinski (GInstanceInitFunc)sp_paint_selector_init,
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler 0 // value_table
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler type = g_type_register_static(GTK_TYPE_VBOX, "SPPaintSelector", &info, static_cast<GTypeFlags>(0));
f6df6236fcf18524e049bba12b69704af32eff90Josh Andlersp_paint_selector_class_init(SPPaintSelectorClass *klass)
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler parent_class = (GtkVBoxClass*)gtk_type_class(GTK_TYPE_VBOX);
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler psel_signals[MODE_CHANGED] = g_signal_new("mode_changed",
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler (GSignalFlags)(G_SIGNAL_RUN_FIRST | G_SIGNAL_NO_RECURSE),
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler G_STRUCT_OFFSET(SPPaintSelectorClass, mode_changed),
7bda77e763c0af49270427593108b66455dfd125Krzysztof Kosinski (GSignalFlags)(G_SIGNAL_RUN_FIRST | G_SIGNAL_NO_RECURSE),
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler (GSignalFlags)(G_SIGNAL_RUN_FIRST | G_SIGNAL_NO_RECURSE),
7bda77e763c0af49270427593108b66455dfd125Krzysztof Kosinski psel_signals[RELEASED] = g_signal_new("released",
7bda77e763c0af49270427593108b66455dfd125Krzysztof Kosinski (GSignalFlags)(G_SIGNAL_RUN_FIRST | G_SIGNAL_NO_RECURSE),
7bda77e763c0af49270427593108b66455dfd125Krzysztof Kosinski G_STRUCT_OFFSET(SPPaintSelectorClass, released),
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler (GSignalFlags)(G_SIGNAL_RUN_FIRST | G_SIGNAL_NO_RECURSE),
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler psel_signals[FILLRULE_CHANGED] = g_signal_new("fillrule_changed",
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler (GSignalFlags)(G_SIGNAL_RUN_FIRST | G_SIGNAL_NO_RECURSE),
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler G_STRUCT_OFFSET(SPPaintSelectorClass, fillrule_changed),
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler object_class->destroy = sp_paint_selector_destroy;
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler psel->mode = static_cast<SPPaintSelector::Mode>(-1); // huh? do you mean 0xff? -- I think this means "not in the enum"
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler /* Paint style button box */
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler gtk_container_set_border_width(GTK_CONTAINER(psel->style), 4);
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler gtk_box_pack_start(GTK_BOX(psel), psel->style, FALSE, FALSE, 0);
76addc201c409e81eaaa73fe27cc0f79c4db097cKrzysztof Kosiński psel->none = sp_paint_selector_style_button_add(psel, INKSCAPE_ICON_PAINT_NONE,
76addc201c409e81eaaa73fe27cc0f79c4db097cKrzysztof Kosiński SPPaintSelector::MODE_NONE, _("No paint"));
76addc201c409e81eaaa73fe27cc0f79c4db097cKrzysztof Kosiński psel->solid = sp_paint_selector_style_button_add(psel, INKSCAPE_ICON_PAINT_SOLID,
76addc201c409e81eaaa73fe27cc0f79c4db097cKrzysztof Kosiński SPPaintSelector::MODE_COLOR_RGB, _("Flat color"));
76addc201c409e81eaaa73fe27cc0f79c4db097cKrzysztof Kosiński psel->gradient = sp_paint_selector_style_button_add(psel, INKSCAPE_ICON_PAINT_GRADIENT_LINEAR,
76addc201c409e81eaaa73fe27cc0f79c4db097cKrzysztof Kosiński SPPaintSelector::MODE_GRADIENT_LINEAR, _("Linear gradient"));
76addc201c409e81eaaa73fe27cc0f79c4db097cKrzysztof Kosiński psel->radial = sp_paint_selector_style_button_add(psel, INKSCAPE_ICON_PAINT_GRADIENT_RADIAL,
76addc201c409e81eaaa73fe27cc0f79c4db097cKrzysztof Kosiński SPPaintSelector::MODE_GRADIENT_RADIAL, _("Radial gradient"));
76addc201c409e81eaaa73fe27cc0f79c4db097cKrzysztof Kosiński psel->pattern = sp_paint_selector_style_button_add(psel, INKSCAPE_ICON_PAINT_PATTERN,
76addc201c409e81eaaa73fe27cc0f79c4db097cKrzysztof Kosiński SPPaintSelector::MODE_PATTERN, _("Pattern"));
76addc201c409e81eaaa73fe27cc0f79c4db097cKrzysztof Kosiński psel->swatch = sp_paint_selector_style_button_add(psel, INKSCAPE_ICON_PAINT_SWATCH,
76addc201c409e81eaaa73fe27cc0f79c4db097cKrzysztof Kosiński SPPaintSelector::MODE_SWATCH, _("Swatch"));
76addc201c409e81eaaa73fe27cc0f79c4db097cKrzysztof Kosiński psel->unset = sp_paint_selector_style_button_add(psel, INKSCAPE_ICON_PAINT_UNKNOWN,
76addc201c409e81eaaa73fe27cc0f79c4db097cKrzysztof Kosiński SPPaintSelector::MODE_UNSET, _("Unset paint (make it undefined so it can be inherited)"));
76addc201c409e81eaaa73fe27cc0f79c4db097cKrzysztof Kosiński /* Fillrule */
76addc201c409e81eaaa73fe27cc0f79c4db097cKrzysztof Kosiński psel->fillrulebox = gtk_hbox_new(FALSE, 0);
76addc201c409e81eaaa73fe27cc0f79c4db097cKrzysztof Kosiński gtk_box_pack_end(GTK_BOX(psel->style), psel->fillrulebox, FALSE, FALSE, 0);
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler gtk_button_set_relief(GTK_BUTTON(psel->evenodd), GTK_RELIEF_NONE);
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler gtk_toggle_button_set_mode(GTK_TOGGLE_BUTTON(psel->evenodd), FALSE);
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler // TRANSLATORS: for info, see http://www.w3.org/TR/2000/CR-SVG-20000802/painting.html#FillRuleProperty
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler gtk_widget_set_tooltip_text(psel->evenodd, _("Any path self-intersections or subpaths create holes in the fill (fill-rule: evenodd)"));
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler gtk_object_set_data(GTK_OBJECT(psel->evenodd), "mode", GUINT_TO_POINTER(SPPaintSelector::FILLRULE_EVENODD));
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler w = sp_icon_new(Inkscape::ICON_SIZE_DECORATION, INKSCAPE_ICON_FILL_RULE_EVEN_ODD);
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler gtk_container_add(GTK_CONTAINER(psel->evenodd), w);
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler gtk_box_pack_start(GTK_BOX(psel->fillrulebox), psel->evenodd, FALSE, FALSE, 0);
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler g_signal_connect(G_OBJECT(psel->evenodd), "toggled", G_CALLBACK(sp_paint_selector_fillrule_toggled), psel);
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler psel->nonzero = gtk_radio_button_new(gtk_radio_button_get_group(GTK_RADIO_BUTTON(psel->evenodd)));
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler gtk_button_set_relief(GTK_BUTTON(psel->nonzero), GTK_RELIEF_NONE);
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler gtk_toggle_button_set_mode(GTK_TOGGLE_BUTTON(psel->nonzero), FALSE);
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler // TRANSLATORS: for info, see http://www.w3.org/TR/2000/CR-SVG-20000802/painting.html#FillRuleProperty
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler gtk_widget_set_tooltip_text(psel->nonzero, _("Fill is solid unless a subpath is counterdirectional (fill-rule: nonzero)"));
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler gtk_object_set_data(GTK_OBJECT(psel->nonzero), "mode", GUINT_TO_POINTER(SPPaintSelector::FILLRULE_NONZERO));
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler w = sp_icon_new(Inkscape::ICON_SIZE_DECORATION, INKSCAPE_ICON_FILL_RULE_NONZERO);
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler gtk_container_add(GTK_CONTAINER(psel->nonzero), w);
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler gtk_box_pack_start(GTK_BOX(psel->fillrulebox), psel->nonzero, FALSE, FALSE, 0);
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler g_signal_connect(G_OBJECT(psel->nonzero), "toggled", G_CALLBACK(sp_paint_selector_fillrule_toggled), psel);
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler gtk_container_set_border_width(GTK_CONTAINER(psel->frame), 0);
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler gtk_box_pack_start(GTK_BOX(psel), psel->frame, TRUE, TRUE, 0);
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler /* Last used color */
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler SPPaintSelector *psel = SP_PAINT_SELECTOR(object);
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler // clean up our long-living pattern menu
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler g_object_set_data(G_OBJECT(psel),"patternmenu",NULL);
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler (* ((GtkObjectClass *) parent_class)->destroy)(object);
f6df6236fcf18524e049bba12b69704af32eff90Josh Andlerstatic GtkWidget *sp_paint_selector_style_button_add(SPPaintSelector *psel,
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler gchar const *pixmap, SPPaintSelector::Mode mode,
7bda77e763c0af49270427593108b66455dfd125Krzysztof Kosinski gtk_container_set_border_width(GTK_CONTAINER(b), 0);
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler gtk_button_set_relief(GTK_BUTTON(b), GTK_RELIEF_NONE);
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler gtk_toggle_button_set_mode(GTK_TOGGLE_BUTTON(b), FALSE);
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler gtk_object_set_data(GTK_OBJECT(b), "mode", GUINT_TO_POINTER(mode));
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler w = sp_icon_new(Inkscape::ICON_SIZE_BUTTON, pixmap);
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler gtk_box_pack_start(GTK_BOX(psel->style), b, FALSE, FALSE, 0);
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler g_signal_connect(G_OBJECT(b), "toggled", G_CALLBACK(sp_paint_selector_style_button_toggled), psel);
f6df6236fcf18524e049bba12b69704af32eff90Josh Andlersp_paint_selector_style_button_toggled(GtkToggleButton *tb, SPPaintSelector *psel)
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler if (!psel->update && gtk_toggle_button_get_active(tb)) {
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler psel->setMode(static_cast<SPPaintSelector::Mode>(GPOINTER_TO_UINT(gtk_object_get_data(GTK_OBJECT(tb), "mode"))));
f6df6236fcf18524e049bba12b69704af32eff90Josh Andlersp_paint_selector_fillrule_toggled(GtkToggleButton *tb, SPPaintSelector *psel)
7bda77e763c0af49270427593108b66455dfd125Krzysztof Kosinski if (!psel->update && gtk_toggle_button_get_active(tb)) {
7bda77e763c0af49270427593108b66455dfd125Krzysztof Kosinski SPPaintSelector::FillRule fr = static_cast<SPPaintSelector::FillRule>(GPOINTER_TO_UINT(g_object_get_data(G_OBJECT(tb), "mode")));
7bda77e763c0af49270427593108b66455dfd125Krzysztof Kosinski g_signal_emit(G_OBJECT(psel), psel_signals[FILLRULE_CHANGED], 0, fr);
f6df6236fcf18524e049bba12b69704af32eff90Josh Andlersp_paint_selector_show_fillrule(SPPaintSelector *psel, bool is_fill)
f6df6236fcf18524e049bba12b69704af32eff90Josh AndlerSPPaintSelector *sp_paint_selector_new(FillOrStroke kind)
7bda77e763c0af49270427593108b66455dfd125Krzysztof Kosinski SPPaintSelector *psel = static_cast<SPPaintSelector*>(gtk_type_new(SP_TYPE_PAINT_SELECTOR));
7bda77e763c0af49270427593108b66455dfd125Krzysztof Kosinski psel->setMode(SPPaintSelector::MODE_MULTIPLE);
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler // This silliness is here because I don't know how to pass a parameter to the
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler // GtkObject "constructor" (sp_paint_selector_init). Remove it when paint_selector
7bda77e763c0af49270427593108b66455dfd125Krzysztof Kosinski // becomes a normal class.
7bda77e763c0af49270427593108b66455dfd125Krzysztof Kosinski sp_paint_selector_show_fillrule(psel, kind == FILL);
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler g_print("Mode change %d -> %d %s -> %s\n", this->mode, mode, modeStrings[this->mode], modeStrings[mode]);
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler sp_paint_selector_set_mode_gradient(this, mode);
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler g_warning("file %s: line %d: Unknown paint mode %d", __FILE__, __LINE__, mode);
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler g_signal_emit(G_OBJECT(this), psel_signals[MODE_CHANGED], 0, this->mode);
f6df6236fcf18524e049bba12b69704af32eff90Josh Andlervoid SPPaintSelector::setFillrule(FillRule fillrule)
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler // TODO this flips widgets but does not use a member to store state. Revisit
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(evenodd), (fillrule == FILLRULE_EVENODD));
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(nonzero), (fillrule == FILLRULE_NONZERO));
f6df6236fcf18524e049bba12b69704af32eff90Josh Andlervoid SPPaintSelector::setColorAlpha(SPColor const &color, float alpha)
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler g_return_if_fail( ( 0.0 <= alpha ) && ( alpha <= 1.0 ) );
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler if ( sp_color_get_colorspace_type(color) == SP_COLORSPACE_TYPE_CMYK )
40742313779ee5e43be93a9191f1c86412cf183bKrzysztof Kosiński#ifdef SP_PS_VERBOSE
40742313779ee5e43be93a9191f1c86412cf183bKrzysztof Kosiński g_print("PaintSelector set CMYKA\n");
40742313779ee5e43be93a9191f1c86412cf183bKrzysztof Kosiński sp_paint_selector_set_mode(psel, MODE_COLOR_CMYK);
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler csel = reinterpret_cast<SPColorSelector*>(gtk_object_get_data(GTK_OBJECT(selector), "color-selector"));
f6df6236fcf18524e049bba12b69704af32eff90Josh Andlervoid SPPaintSelector::setSwatch(SPGradient *vector )
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler SwatchSelector *swatchsel = static_cast<SwatchSelector*>(g_object_get_data(G_OBJECT(selector), "swatch-selector"));
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler swatchsel->setVector( (vector) ? vector->document : 0, vector );
f6df6236fcf18524e049bba12b69704af32eff90Josh Andlervoid SPPaintSelector::setGradientLinear(SPGradient *vector)
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler SPGradientSelector *gsel = getGradientFromData(this);
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler gsel->setVector((vector) ? vector->document : 0, vector);
e4369b05aaa20df73a37f4d319ce456865cc74f3Krzysztof Kosińskivoid SPPaintSelector::setGradientRadial(SPGradient *vector)
e4369b05aaa20df73a37f4d319ce456865cc74f3Krzysztof Kosiński g_print("PaintSelector set GRADIENT RADIAL\n");
e4369b05aaa20df73a37f4d319ce456865cc74f3Krzysztof Kosiński SPGradientSelector *gsel = getGradientFromData(this);
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler gsel->setVector((vector) ? vector->document : 0, vector);
e4369b05aaa20df73a37f4d319ce456865cc74f3Krzysztof Kosińskivoid SPPaintSelector::setGradientProperties( SPGradientUnits units, SPGradientSpread spread )
e4369b05aaa20df73a37f4d319ce456865cc74f3Krzysztof Kosiński g_return_if_fail(isPaintModeGradient(mode));
e4369b05aaa20df73a37f4d319ce456865cc74f3Krzysztof Kosiński SPGradientSelector *gsel = getGradientFromData(this);
f6df6236fcf18524e049bba12b69704af32eff90Josh Andlervoid SPPaintSelector::getGradientProperties( SPGradientUnits &units, SPGradientSpread &spread) const
e4369b05aaa20df73a37f4d319ce456865cc74f3Krzysztof Kosiński SPGradientSelector *gsel = getGradientFromData(this);
d1bde559850436556ebee2e70e10f1cfc8aff636Krzysztof Kosiński * \post (alpha == NULL) || (*alpha in [0.0, 1.0]).
d1bde559850436556ebee2e70e10f1cfc8aff636Krzysztof Kosińskivoid SPPaintSelector::getColorAlpha(SPColor &color, gfloat &alpha) const
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler csel = reinterpret_cast<SPColorSelector*>(g_object_get_data(G_OBJECT(selector), "color-selector"));
return vect;
if ((psel->mode == SPPaintSelector::MODE_COLOR_RGB) || (psel->mode == SPPaintSelector::MODE_COLOR_CMYK)) {
#ifdef SP_PS_VERBOSE
if ((psel->mode == SPPaintSelector::MODE_GRADIENT_LINEAR) || (psel->mode == SPPaintSelector::MODE_GRADIENT_RADIAL)) {
g_signal_connect(G_OBJECT(gsel), "released", G_CALLBACK(sp_paint_selector_gradient_released), psel);
#ifdef SP_PS_VERBOSE
GSList *
return NULL;
if (SP_PATTERN(l->data) == pattern_getroot(SP_PATTERN(l->data))) { // only if this is a root pattern
return pl;
* Adds menu items for pattern list - derived from marker code, left hb etc in to make addition of previews easier at some point.
gtk_widget_show(i);
GtkWidget *l;
gtk_widget_show(l);
static void sp_pattern_list_from_doc (GtkWidget *m, SPDocument * /*current_doc*/, SPDocument *source, SPDocument * /*pattern_doc*/)
// find and load patterns.svg
gtk_widget_show(i);
// suck in from patterns.svg
if (patterns_doc) {
static GtkWidget*
gtk_widget_show(m);
if (!doc) {
GtkWidget *i;
gtk_widget_show(i);
return mnu;
if (update) {
int patpos = 0;
patpos = i;
gtk_label_set_markup(GTK_LABEL(l), _("Use the <b>Node tool</b> to adjust position, scale, and rotation of the pattern on canvas. Use <b>Object > Pattern > Objects to Pattern</b> to create a new pattern from selection."));
#ifdef SP_PS_VERBOSE
return NULL;
if (pat_obj) {
pat = 0;
return pat;
swatchsel = static_cast<SwatchSelector*>(g_object_get_data(G_OBJECT(psel->selector), "swatch-selector"));
#ifdef SP_PS_VERBOSE
// TODO this seems very bad to be taking in a desktop pointer to muck with. Logic probably belongs elsewhere
void SPPaintSelector::setFlatColor( SPDesktop *desktop, gchar const *color_property, gchar const *opacity_property )
#ifdef SP_PS_VERBOSE
rgba,
SPPaintServer const *server = (kind == FILL) ? style.getFillPaintServer() : style.getStrokePaintServer();
#ifdef SP_PS_VERBOSE
g_message("==== server:%p %s grad:%s swatch:%s", server, server->getId(), (SP_IS_GRADIENT(server)?"Y":"n"), (SP_IS_GRADIENT(server) && SP_GRADIENT(server)->getVector()->isSwatch()?"Y":"n"));
return mode;