gradient-vector.cpp revision 9b9f1cf38b528f0fc1f86654a90cd066787caf5e
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm * Gradient vector selection widget
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm * Authors:
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm * Lauris Kaplinski <lauris@kaplinski.com>
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm * bulia byak <buliabyak@users.sf.net>
1b3a8414f17dc95fc921d999ea715c99d10dd4aaAlex Valavanis * MenTaLguY <mental@rydia.net>
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm * Jon A. Cruz <jon@joncruz.org>
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm * Abhishek Sharma
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm * Copyright (C) 2001-2002 Lauris Kaplinski
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm * Copyright (C) 2001 Ximian, Inc.
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm * Copyright (C) 2004 Monash University
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm * Copyright (C) 2004 David Turner
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm * Copyright (C) 2006 MenTaLguY
b1771b4ea91b15a5da4a96f93e8aa78e700fd51ajohanengelen * Copyright (C) 2010 Jon A. Cruz
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm * Released under GNU GPL, read the file 'COPYING' for more information
79d46cc367c4181803d9a7a327b163643f23e8a7cilix#include "../inkscape.h"
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm#include "../helper/window.h"
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrmstatic void sp_gradient_vector_selector_class_init(SPGradientVectorSelectorClass *klass);
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrmstatic void sp_gradient_vector_selector_init(SPGradientVectorSelector *gvs);
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrmstatic void sp_gradient_vector_selector_destroy(GtkObject *object);
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrmstatic void sp_gvs_gradient_release(SPObject *obj, SPGradientVectorSelector *gvs);
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrmstatic void sp_gvs_defs_release(SPObject *defs, SPGradientVectorSelector *gvs);
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrmstatic void sp_gvs_defs_modified(SPObject *defs, guint flags, SPGradientVectorSelector *gvs);
79291918d036d77d586b6eba265d8d2ac0a7fee5cilixstatic void sp_gvs_rebuild_gui_full(SPGradientVectorSelector *gvs);
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrmstatic void gr_combo_box_changed (GtkComboBox *widget, SPGradientVectorSelector *gvs);
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm// TODO FIXME kill these globals!!!
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrmstatic gint x = -1000, y = -1000, w = 0, h = 0; // impossible original values to make sure they are read from prefs
f84b3e8cf4811cb3ce6c33fb7341d0e836be583cjohanengelenstatic Glib::ustring const prefs_path = "/dialogs/gradienteditor/";
f84b3e8cf4811cb3ce6c33fb7341d0e836be583cjohanengelenGType sp_gradient_vector_selector_get_type(void)
7e06f69b2d196711819d5fb5935e09cd89734bb4johanengelen reinterpret_cast<GClassInitFunc>(sp_gradient_vector_selector_class_init),
7073d105e612f7dc898c292742bee9655d2a51b2johanengelen 0, /* n_preallocs */
7073d105e612f7dc898c292742bee9655d2a51b2johanengelen reinterpret_cast<GInstanceInitFunc>(sp_gradient_vector_selector_init),
7073d105e612f7dc898c292742bee9655d2a51b2johanengelen 0, /* value_table */
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm "SPGradientVectorSelector",
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm static_cast< GTypeFlags >(0) );
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrmstatic void sp_gradient_vector_selector_class_init(SPGradientVectorSelectorClass *klass)
0903335a0099bd7ee779925f43a15a2216a0e863johanengelen parent_class = static_cast<GtkVBoxClass*>(g_type_class_peek_parent(klass));
0903335a0099bd7ee779925f43a15a2216a0e863johanengelen signals[VECTOR_SET] = g_signal_new( "vector_set",
0903335a0099bd7ee779925f43a15a2216a0e863johanengelen G_STRUCT_OFFSET(SPGradientVectorSelectorClass, vector_set),
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm object_class->destroy = sp_gradient_vector_selector_destroy;
fefed98e624e5b375661d137181340caa08440e3johanengelenstatic void sp_gradient_vector_selector_init(SPGradientVectorSelector *gvs)
797bee69297bbdd86c5cff2e0771a71d1e2ac69dcilix new (&gvs->gradient_release_connection) sigc::connection();
797bee69297bbdd86c5cff2e0771a71d1e2ac69dcilix new (&gvs->defs_release_connection) sigc::connection();
5b20351508dc029f37f23fb7add6d0b43bf47f20johanengelen new (&gvs->defs_modified_connection) sigc::connection();
797bee69297bbdd86c5cff2e0771a71d1e2ac69dcilix gvs->store = gtk_list_store_new (3, GDK_TYPE_PIXBUF, G_TYPE_STRING, G_TYPE_POINTER);
797bee69297bbdd86c5cff2e0771a71d1e2ac69dcilix gvs->combo_box = gtk_combo_box_new_with_model (GTK_TREE_MODEL (gvs->store));
797bee69297bbdd86c5cff2e0771a71d1e2ac69dcilix gvs->combo_connection = g_signal_connect (G_OBJECT (gvs->combo_box), "changed", G_CALLBACK (gr_combo_box_changed), gvs);
797bee69297bbdd86c5cff2e0771a71d1e2ac69dcilix GtkCellRenderer *renderer = gtk_cell_renderer_pixbuf_new ();
797bee69297bbdd86c5cff2e0771a71d1e2ac69dcilix gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (gvs->combo_box), renderer, FALSE);
1e944d29efb206f5d0b5d1069cb098e22169d548cilix gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (gvs->combo_box), renderer, "pixbuf", 0, NULL);
624e4bb114c588505c592e405dbad6570e5704feDiederik van Lierop gtk_cell_renderer_set_padding(renderer, 5, 0);
624e4bb114c588505c592e405dbad6570e5704feDiederik van Lierop renderer = gtk_cell_renderer_text_new ();
5b20351508dc029f37f23fb7add6d0b43bf47f20johanengelen gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (gvs->combo_box), renderer, TRUE);
42ba1b712b7b430669fc49aa9facb439181081becilix gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (gvs->combo_box), renderer, "text", 1, NULL);
0b2d8abc1011ad865fce3b883ccb2587cb15cc90Johan B. C. Engelen gtk_box_pack_start(GTK_BOX(gvs), gvs->combo_box, TRUE, TRUE, 0);
797bee69297bbdd86c5cff2e0771a71d1e2ac69dcilixstatic void sp_gradient_vector_selector_destroy(GtkObject *object)
797bee69297bbdd86c5cff2e0771a71d1e2ac69dcilix SPGradientVectorSelector *gvs = SP_GRADIENT_VECTOR_SELECTOR(object);
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm if ((reinterpret_cast<GtkObjectClass *>(parent_class))->destroy) {
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm (* (reinterpret_cast<GtkObjectClass *>(parent_class))->destroy) (object);
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrmGtkWidget *sp_gradient_vector_selector_new(SPDocument *doc, SPGradient *gr)
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm g_return_val_if_fail(!gr || (gr->document == doc), NULL);
if (doc) {
return gvs;
void sp_gradient_vector_selector_set_gradient(SPGradientVectorSelector *gvs, SPDocument *doc, SPGradient *gr)
if (doc) {
gvs->defs_release_connection = doc->getDefs()->connectRelease(sigc::bind<1>(sigc::ptr_fun(&sp_gvs_defs_release), gvs));
gvs->defs_modified_connection = doc->getDefs()->connectModified(sigc::bind<2>(sigc::ptr_fun(&sp_gvs_defs_modified), gvs));
if (gr) {
gvs->gradient_release_connection = gr->connectRelease(sigc::bind<1>(sigc::ptr_fun(&sp_gvs_gradient_release), gvs));
if (strlen(id) > 15 && (!strncmp (id, "#linearGradient", 15) || !strncmp (id, "#radialGradient", 15)))
} else if (!gl) {
while (gl) {
if (gr) {
if (norm) {
gvs->gradient_release_connection = norm->connectRelease(sigc::bind<1>(sigc::ptr_fun(&sp_gvs_gradient_release), gvs));
static void sp_gvs_defs_modified(SPObject */*defs*/, guint /*flags*/, SPGradientVectorSelector *gvs)
swatched = true;
sp_gvs_rebuild_gui_full(this);
#include "../widgets/sp-color-notebook.h"
#include "../widgets/widget-sizes.h"
#include "../xml/node-event-vector.h"
#include "../svg/svg-color.h"
static gint sp_gradient_vector_dialog_delete(GtkWidget *widget, GdkEvent *event, GtkWidget *dialog);
static void grad_edit_dia_stop_added_or_removed(Inkscape::XML::Node */*repr*/, Inkscape::XML::Node */*child*/, Inkscape::XML::Node */*ref*/, gpointer data)
if (!combo_box) {
if (!store) {
if (!sl) {
Inkscape::UI::Widget::ColorPreview *cpv = Gtk::manage(new Inkscape::UI::Widget::ColorPreview(sp_stop_get_rgba32(stop)));
if (!stop) {
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;
g_signal_connect(G_OBJECT(INKSCAPE), "activate_desktop", G_CALLBACK(sp_transientize_callback), &wd);
g_signal_connect(G_OBJECT(INKSCAPE), "shut_down", G_CALLBACK(sp_gradient_vector_dialog_delete), dlg);
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 = (sigc::connection *)g_object_get_data(G_OBJECT(object), "gradient_release_connection");
sigc::connection *modified_connection = (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(sp_stop_get_rgba32(stop)));