gradient-vector.cpp revision d2e42b9425ccd4c2d4c20c2217455da177035e48
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler * Gradient vector selection widget
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler * Lauris Kaplinski <lauris@kaplinski.com>
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler * bulia byak <buliabyak@users.sf.net>
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler * MenTaLguY <mental@rydia.net>
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler * Jon A. Cruz <jon@joncruz.org>
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler * Abhishek Sharma
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler * Copyright (C) 2001-2002 Lauris Kaplinski
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler * Copyright (C) 2001 Ximian, Inc.
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler * Copyright (C) 2004 Monash University
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler * Copyright (C) 2004 David Turner
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler * Copyright (C) 2006 MenTaLguY
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler * Copyright (C) 2010 Jon A. Cruz
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler * Released under GNU GPL, read the file 'COPYING' for more information
f6df6236fcf18524e049bba12b69704af32eff90Josh Andlerstatic void sp_gradient_vector_selector_destroy(GtkWidget *object);
f6df6236fcf18524e049bba12b69704af32eff90Josh Andlerstatic void sp_gradient_vector_selector_destroy(GtkObject *object);
f6df6236fcf18524e049bba12b69704af32eff90Josh Andlerstatic void sp_gvs_gradient_release(SPObject *obj, SPGradientVectorSelector *gvs);
f6df6236fcf18524e049bba12b69704af32eff90Josh Andlerstatic void sp_gvs_defs_release(SPObject *defs, SPGradientVectorSelector *gvs);
f6df6236fcf18524e049bba12b69704af32eff90Josh Andlerstatic void sp_gvs_defs_modified(SPObject *defs, guint flags, SPGradientVectorSelector *gvs);
f6df6236fcf18524e049bba12b69704af32eff90Josh Andlerstatic void sp_gvs_rebuild_gui_full(SPGradientVectorSelector *gvs);
f6df6236fcf18524e049bba12b69704af32eff90Josh Andlerstatic SPStop *get_selected_stop( GtkWidget *vb);
f6df6236fcf18524e049bba12b69704af32eff90Josh Andlervoid gr_get_usage_counts(SPDocument *doc, std::map<SPGradient *, gint> *mapUsageCount );
f6df6236fcf18524e049bba12b69704af32eff90Josh Andlerunsigned long sp_gradient_to_hhssll(SPGradient *gr);
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler// TODO FIXME kill these globals!!!
f6df6236fcf18524e049bba12b69704af32eff90Josh Andlerstatic gint x = -1000, y = -1000, w = 0, h = 0; // impossible original values to make sure they are read from prefs
f6df6236fcf18524e049bba12b69704af32eff90Josh Andlerstatic Glib::ustring const prefs_path = "/dialogs/gradienteditor/";
f6df6236fcf18524e049bba12b69704af32eff90Josh AndlerG_DEFINE_TYPE(SPGradientVectorSelector, sp_gradient_vector_selector, GTK_TYPE_BOX);
f6df6236fcf18524e049bba12b69704af32eff90Josh AndlerG_DEFINE_TYPE(SPGradientVectorSelector, sp_gradient_vector_selector, GTK_TYPE_VBOX);
f6df6236fcf18524e049bba12b69704af32eff90Josh Andlerstatic void sp_gradient_vector_selector_class_init(SPGradientVectorSelectorClass *klass)
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler GObjectClass *gobject_class = G_OBJECT_CLASS(klass);
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler signals[VECTOR_SET] = g_signal_new( "vector_set",
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler G_STRUCT_OFFSET(SPGradientVectorSelectorClass, vector_set),
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler GtkWidgetClass *widget_class = GTK_WIDGET_CLASS(klass);
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler widget_class->destroy = sp_gradient_vector_selector_destroy;
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler GtkObjectClass *object_class = GTK_OBJECT_CLASS(klass);
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler object_class->destroy = sp_gradient_vector_selector_destroy;
f6df6236fcf18524e049bba12b69704af32eff90Josh Andlerstatic void sp_gradient_vector_selector_init(SPGradientVectorSelector *gvs)
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler gtk_orientable_set_orientation(GTK_ORIENTABLE(gvs), GTK_ORIENTATION_VERTICAL);
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler new (&gvs->gradient_release_connection) sigc::connection();
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler new (&gvs->defs_release_connection) sigc::connection();
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler new (&gvs->defs_modified_connection) sigc::connection();
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler gvs->columns = new SPGradientSelector::ModelColumns();
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler gvs->store = Gtk::ListStore::create(*gvs->columns);
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler new (&gvs->tree_select_connection) sigc::connection();
f6df6236fcf18524e049bba12b69704af32eff90Josh Andlerstatic void sp_gradient_vector_selector_destroy(GtkWidget *object)
f6df6236fcf18524e049bba12b69704af32eff90Josh Andlerstatic void sp_gradient_vector_selector_destroy(GtkObject *object)
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler SPGradientVectorSelector *gvs = SP_GRADIENT_VECTOR_SELECTOR(object);
7bda77e763c0af49270427593108b66455dfd125Krzysztof Kosinski gvs->gradient_release_connection.disconnect();
7bda77e763c0af49270427593108b66455dfd125Krzysztof Kosinski gvs->defs_modified_connection.~connection();
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler if ((GTK_WIDGET_CLASS(sp_gradient_vector_selector_parent_class))->destroy) {
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler (GTK_WIDGET_CLASS(sp_gradient_vector_selector_parent_class))->destroy(object);
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler if ((GTK_OBJECT_CLASS(sp_gradient_vector_selector_parent_class))->destroy) {
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler (GTK_OBJECT_CLASS(sp_gradient_vector_selector_parent_class))->destroy(object);
7bda77e763c0af49270427593108b66455dfd125Krzysztof KosinskiGtkWidget *sp_gradient_vector_selector_new(SPDocument *doc, SPGradient *gr)
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler g_return_val_if_fail(!gr || SP_IS_GRADIENT(gr), NULL);
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler g_return_val_if_fail(!gr || (gr->document == doc), NULL);
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler gvs = static_cast<GtkWidget*>(g_object_new(SP_TYPE_GRADIENT_VECTOR_SELECTOR, NULL));
7bda77e763c0af49270427593108b66455dfd125Krzysztof Kosinski sp_gradient_vector_selector_set_gradient(SP_GRADIENT_VECTOR_SELECTOR(gvs), doc, gr);
7bda77e763c0af49270427593108b66455dfd125Krzysztof Kosinski sp_gvs_rebuild_gui_full(SP_GRADIENT_VECTOR_SELECTOR(gvs));
7bda77e763c0af49270427593108b66455dfd125Krzysztof Kosinskivoid sp_gradient_vector_selector_set_gradient(SPGradientVectorSelector *gvs, SPDocument *doc, SPGradient *gr)
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler// g_message("sp_gradient_vector_selector_set_gradient(%p, %p, %p) [%s] %d %d", gvs, doc, gr,
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler// (gr ? gr->getId():"N/A"),
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler// (gr ? gr->isSwatch() : -1),
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler// (gr ? gr->isSolid() : -1));
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler g_return_if_fail(SP_IS_GRADIENT_VECTOR_SELECTOR(gvs));
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler /* Disconnect signals */
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler // Connect signals
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler gvs->defs_release_connection = doc->getDefs()->connectRelease(sigc::bind<1>(sigc::ptr_fun(&sp_gvs_defs_release), gvs));
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler gvs->defs_modified_connection = doc->getDefs()->connectModified(sigc::bind<2>(sigc::ptr_fun(&sp_gvs_defs_modified), gvs));
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler gvs->gradient_release_connection = gr->connectRelease(sigc::bind<1>(sigc::ptr_fun(&sp_gvs_gradient_release), gvs));
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler if (!suppress) g_signal_emit(G_OBJECT(gvs), signals[VECTOR_SET], 0, gr);
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler // Harder case - keep document, rebuild list and stuff
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler // fixme: (Lauris)
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler sp_gradient_vector_selector_set_gradient(gvs, NULL, NULL);
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler sp_gradient_vector_selector_set_gradient(gvs, doc, gr);
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler g_signal_emit(G_OBJECT(gvs), signals[VECTOR_SET], 0, gr);
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler /* The case of setting NULL -> NULL is not very interesting */
f6df6236fcf18524e049bba12b69704af32eff90Josh AndlerSPDocument *sp_gradient_vector_selector_get_document(SPGradientVectorSelector *gvs)
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler g_return_val_if_fail(SP_IS_GRADIENT_VECTOR_SELECTOR(gvs), NULL);
f6df6236fcf18524e049bba12b69704af32eff90Josh AndlerSPGradient *sp_gradient_vector_selector_get_gradient(SPGradientVectorSelector *gvs)
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler g_return_val_if_fail(SP_IS_GRADIENT_VECTOR_SELECTOR(gvs), NULL);
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler const gchar *id = obj->label() ? obj->label() : obj->getId();
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler if (strlen(id) > 14 && (!strncmp (id, "linearGradient", 14) || !strncmp (id, "radialGradient", 14)))
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler return gr_ellipsize_text (g_strdup_printf ("%s", id+14), 35);
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler * Ellipse text if longer than maxlen, "50% start text + ... + ~50% end text"
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler * Text should be > length 8 or just return the original text
f6df6236fcf18524e049bba12b69704af32eff90Josh AndlerGlib::ustring gr_ellipsize_text(Glib::ustring const &src, size_t maxlen)
7bda77e763c0af49270427593108b66455dfd125Krzysztof Kosinski if (src.length() > maxlen && maxlen > 8) {
7bda77e763c0af49270427593108b66455dfd125Krzysztof Kosinski size_t p2 = (size_t) src.length() - (maxlen - p1 - 1);
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler return src.substr(0, p1) + "…" + src.substr(p2);
f6df6236fcf18524e049bba12b69704af32eff90Josh Andlerstatic void sp_gvs_rebuild_gui_full(SPGradientVectorSelector *gvs)
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler /* Clear old list, if there is any */
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler /* Pick up all gradients with vectors */
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler const GSList *gradients = gvs->gr->document->getResourceList("gradient");
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler for (const GSList *curr = gradients; curr; curr = curr->next) {
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler if ( grad->hasStops() && (grad->isSwatch() == gvs->swatched) ) {
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler /* Get usage count of all the gradients */
7bda77e763c0af49270427593108b66455dfd125Krzysztof Kosinski gr_get_usage_counts(gvs->doc, &usageCount);
7bda77e763c0af49270427593108b66455dfd125Krzysztof Kosinski Gtk::TreeModel::Row row = *(gvs->store->append());
7bda77e763c0af49270427593108b66455dfd125Krzysztof Kosinski row[gvs->columns->name] = _("No document selected");
7bda77e763c0af49270427593108b66455dfd125Krzysztof Kosinski } else if (!gl) {
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler Gtk::TreeModel::Row row = *(gvs->store->append());
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler row[gvs->columns->name] = _("No gradients in document");
7bda77e763c0af49270427593108b66455dfd125Krzysztof Kosinski Gtk::TreeModel::Row row = *(gvs->store->append());
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler row[gvs->columns->name] = _("No gradient selected");
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler unsigned long hhssll = sp_gradient_to_hhssll(gr);
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler GdkPixbuf *pixb = sp_gradient_to_pixbuf (gr, 64, 18);
7bda77e763c0af49270427593108b66455dfd125Krzysztof Kosinski Glib::ustring label = gr_prepare_label(gr);
7bda77e763c0af49270427593108b66455dfd125Krzysztof Kosinski Gtk::TreeModel::Row row = *(gvs->store->append());
7bda77e763c0af49270427593108b66455dfd125Krzysztof Kosinski row[gvs->columns->pixbuf] = Glib::wrap(pixb);
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler * Return a "HHSSLL" version of the first stop color so we can sort by it
f6df6236fcf18524e049bba12b69704af32eff90Josh Andlerunsigned long sp_gradient_to_hhssll(SPGradient *gr)
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler sp_color_rgb_to_hsl_floatv (hsl, SP_RGBA32_R_F(rgba), SP_RGBA32_G_F(rgba), SP_RGBA32_B_F(rgba));
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler return ((int)(hsl[0]*100 * 10000)) + ((int)(hsl[1]*100 * 100)) + ((int)(hsl[2]*100 * 1));
f6df6236fcf18524e049bba12b69704af32eff90Josh Andlerstatic GSList *get_all_doc_items(GSList *list, SPObject *from, bool onlyvisible, bool onlysensitive, bool ingroups, GSList const *exclude)
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler for ( SPObject *child = from->firstChild() ; child; child = child->getNext() ) {
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler list = get_all_doc_items(list, child, onlyvisible, onlysensitive, ingroups, exclude);
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler * Return a SPItem's gradient
f6df6236fcf18524e049bba12b69704af32eff90Josh Andlerstatic SPGradient * gr_item_get_gradient(SPItem *item, gboolean fillorstroke)
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler SPIPaint *item_paint = (fillorstroke) ? &(item->style->fill) : &(item->style->stroke);
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler item->style->getFillPaintServer() : item->style->getStrokePaintServer();
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler if (SP_IS_LINEARGRADIENT(item_server) || SP_IS_RADIALGRADIENT(item_server) ||
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler (SP_IS_GRADIENT(item_server) && SP_GRADIENT(item_server)->getVector()->isSwatch())) {
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler * Map each gradient to its usage count for both fill and stroke styles
f6df6236fcf18524e049bba12b69704af32eff90Josh Andlervoid gr_get_usage_counts(SPDocument *doc, std::map<SPGradient *, gint> *mapUsageCount )
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler Inkscape::Preferences *prefs = Inkscape::Preferences::get();
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler bool onlyvisible = prefs->getBool("/options/kbselection/onlyvisible", true);
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler bool onlysensitive = prefs->getBool("/options/kbselection/onlysensitive", true);
40742313779ee5e43be93a9191f1c86412cf183bKrzysztof Kosiński GSList *all_list = get_all_doc_items(NULL, doc->getRoot(), onlyvisible, onlysensitive, ingroups, NULL);
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler for (GSList *i = all_list; i != NULL; i = i->next) {
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler mapUsageCount->count(gr) > 0 ? (*mapUsageCount)[gr] += 1 : (*mapUsageCount)[gr] = 1;
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler gr = gr_item_get_gradient(item, false); // stroke
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler mapUsageCount->count(gr) > 0 ? (*mapUsageCount)[gr] += 1 : (*mapUsageCount)[gr] = 1;
f6df6236fcf18524e049bba12b69704af32eff90Josh Andlerstatic void sp_gvs_gradient_release(SPObject */*obj*/, SPGradientVectorSelector *gvs)
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler /* Disconnect gradient */
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler /* Rebuild GUI */
f6df6236fcf18524e049bba12b69704af32eff90Josh Andlerstatic void sp_gvs_defs_release(SPObject */*defs*/, SPGradientVectorSelector *gvs)
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler /* Disconnect gradient as well */
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler /* Rebuild GUI */
f6df6236fcf18524e049bba12b69704af32eff90Josh Andlerstatic void sp_gvs_defs_modified(SPObject */*defs*/, guint /*flags*/, SPGradientVectorSelector *gvs)
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler /* fixme: We probably have to check some flags here (Lauris) */
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler/*##################################################################
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler ### Vector Editing Widget
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler ##################################################################*/
f6df6236fcf18524e049bba12b69704af32eff90Josh Andlerstatic GtkWidget *sp_gradient_vector_widget_new(SPGradient *gradient, SPStop *stop);
f6df6236fcf18524e049bba12b69704af32eff90Josh Andlerstatic void sp_gradient_vector_widget_load_gradient(GtkWidget *widget, SPGradient *gradient);
f6df6236fcf18524e049bba12b69704af32eff90Josh Andlerstatic gint sp_gradient_vector_dialog_delete(GtkWidget *widget, GdkEvent *event, GtkWidget *dialog);
f6df6236fcf18524e049bba12b69704af32eff90Josh Andlerstatic void sp_gradient_vector_dialog_destroy(GtkWidget *object, gpointer data);
f6df6236fcf18524e049bba12b69704af32eff90Josh Andlerstatic void sp_gradient_vector_widget_destroy(GtkWidget *object, gpointer data);
f6df6236fcf18524e049bba12b69704af32eff90Josh Andlerstatic void sp_gradient_vector_dialog_destroy(GtkObject *object, gpointer data);
f6df6236fcf18524e049bba12b69704af32eff90Josh Andlerstatic void sp_gradient_vector_widget_destroy(GtkObject *object, gpointer data);
f6df6236fcf18524e049bba12b69704af32eff90Josh Andlerstatic void sp_gradient_vector_gradient_release(SPObject *obj, GtkWidget *widget);
f6df6236fcf18524e049bba12b69704af32eff90Josh Andlerstatic void sp_gradient_vector_gradient_modified(SPObject *obj, guint flags, GtkWidget *widget);
f6df6236fcf18524e049bba12b69704af32eff90Josh Andlerstatic void sp_gradient_vector_color_dragged(SPColorSelector *csel, GObject *object);
f6df6236fcf18524e049bba12b69704af32eff90Josh Andlerstatic void sp_gradient_vector_color_changed(SPColorSelector *csel, GObject *object);
f6df6236fcf18524e049bba12b69704af32eff90Josh Andlerstatic void update_stop_list( GtkWidget *vb, SPGradient *gradient, SPStop *new_stop);
d1bde559850436556ebee2e70e10f1cfc8aff636Krzysztof Kosińskistatic void grad_edit_dia_stop_added_or_removed(Inkscape::XML::Node */*repr*/, Inkscape::XML::Node */*child*/, Inkscape::XML::Node */*ref*/, gpointer data)
d1bde559850436556ebee2e70e10f1cfc8aff636Krzysztof Kosiński SPGradient *gradient = static_cast<SPGradient *>(g_object_get_data(G_OBJECT(vb), "gradient"));
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler//FIXME!!! We must also listen to attr changes on all children (i.e. stops) too,
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler//otherwise the dialog does not reflect undoing color or offset change. This is a major
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler//hassle, unless we have a "one of the descendants changed in some way" signal.
f6df6236fcf18524e049bba12b69704af32eff90Josh Andlerstatic Inkscape::XML::NodeEventVector grad_edit_dia_repr_events =
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler grad_edit_dia_stop_added_or_removed, /* child_added */
f6df6236fcf18524e049bba12b69704af32eff90Josh Andler grad_edit_dia_stop_added_or_removed, /* child_removed */
if (!combo_box) {
if (!store) {
if (!sl) {
Inkscape::UI::Widget::ColorPreview *cpv = Gtk::manage(new Inkscape::UI::Widget::ColorPreview(stop->get_rgba32()));
if (!stop) {
SPColorSelector *csel = static_cast<SPColorSelector*>(g_object_get_data(G_OBJECT(tbl), "cselector"));
bool isEndStop = false;
isEndStop = true;
isEndStop = true;
if (!isEndStop) {
if (combo_box) {
return stop;
if (!blocked) {
if (stop) {
return SP_RGBA32_U_COMPOSE(r, g, b, a);
if (!stop) {
if (!stop) {
if (next) {
if (prev) {
gtk_widget_show(w);
gtk_widget_show(b);
gtk_widget_show(b);
gtk_widget_show(l);
if (!stop) {
return NULL;
gtk_widget_show(f);
if (select_stop) {
return vb;
INKSCAPE.signal_activate_desktop.connect(sigc::bind(sigc::ptr_fun(&sp_transientize_callback), &wd));
sigc::bind(sigc::ptr_fun(&sp_gradient_vector_dialog_delete), (GtkWidget *) NULL, (GdkEvent *) NULL, (GtkWidget *) NULL)
return dlg;
release_connection = static_cast<sigc::connection *>(g_object_get_data(G_OBJECT(widget), "gradient_release_connection"));
modified_connection = static_cast<sigc::connection *>(g_object_get_data(G_OBJECT(widget), "gradient_modified_connection"));
if (old) {
if (gradient) {
if (!release_connection) {
if (!modified_connection) {
*release_connection = gradient->connectRelease(sigc::bind<1>(sigc::ptr_fun(&sp_gradient_vector_gradient_release), widget));
*modified_connection = gradient->connectModified(sigc::bind<2>(sigc::ptr_fun(&sp_gradient_vector_gradient_modified), widget));
if (release_connection) {
delete release_connection;
if (modified_connection) {
delete modified_connection;
if (gradient) {
if (!stop) {
static gboolean sp_gradient_vector_dialog_delete(GtkWidget */*widget*/, GdkEvent */*event*/, GtkWidget */*dialog*/)
sigc::connection *release_connection = static_cast<sigc::connection *>(g_object_get_data(G_OBJECT(object), "gradient_release_connection"));
sigc::connection *modified_connection = static_cast<sigc::connection *>(g_object_get_data(G_OBJECT(object), "gradient_modified_connection"));
if (gradient) {
static void sp_gradient_vector_gradient_modified(SPObject *object, guint /*flags*/, GtkWidget *widget)
if (!blocked) {
if (blocked) {
if (!gradient) {
if (!stop) {
if (blocked) {
if (!gradient) {
if (!stop) {
float alpha = 0;
if (combo_box) {
Inkscape::UI::Widget::ColorPreview *cp = Gtk::manage(new Inkscape::UI::Widget::ColorPreview(stop->get_rgba32()));