diff options
| author | Hugo Rodrigues <me@hugorodrigues.com> | 2006-08-02 21:31:59 +0000 |
|---|---|---|
| committer | haa_rodrigues <haa_rodrigues@users.sourceforge.net> | 2006-08-02 21:31:59 +0000 |
| commit | 8b5a13ebdf2b288d3f888a70e18d143039cb9b3f (patch) | |
| tree | f3cbff6eadac212f95620dfdcdf445e2f91ee106 /src/dialogs/object-properties.cpp | |
| parent | refactored session establishment (diff) | |
| download | inkscape-8b5a13ebdf2b288d3f888a70e18d143039cb9b3f.tar.gz inkscape-8b5a13ebdf2b288d3f888a70e18d143039cb9b3f.zip | |
Added skeleton files for other filter primitives' SP-objects. Added blur slider on fill/stroke dialog (uncomment on object-properties.cpp).
(bzr r1542)
Diffstat (limited to 'src/dialogs/object-properties.cpp')
| -rw-r--r-- | src/dialogs/object-properties.cpp | 143 |
1 files changed, 143 insertions, 0 deletions
diff --git a/src/dialogs/object-properties.cpp b/src/dialogs/object-properties.cpp index f96949f5b..df750c71b 100644 --- a/src/dialogs/object-properties.cpp +++ b/src/dialogs/object-properties.cpp @@ -38,6 +38,8 @@ #include "desktop-handles.h" #include "desktop-style.h" #include "document.h" +#include "document-private.h" +#include <selection.h> #include "xml/repr.h" static GtkWidget *dlg = NULL; @@ -50,6 +52,7 @@ static gchar *prefs_path = "dialogs.fillstroke"; static void sp_fillstroke_selection_modified ( Inkscape::Application *inkscape, Inkscape::Selection *selection, guint flags, GtkObject *base ); static void sp_fillstroke_selection_changed ( Inkscape::Application *inkscape, Inkscape::Selection *selection, GtkObject *base ); static void sp_fillstroke_opacity_changed (GtkAdjustment *a, SPWidget *dlg); +static void sp_fillstroke_blur_changed (GtkAdjustment *a, SPWidget *dlg); static void sp_object_properties_dialog_destroy (GtkObject *object, gpointer data) @@ -213,6 +216,39 @@ sp_object_properties_dialog (void) g_signal_connect ( G_OBJECT (INKSCAPE), "modify_selection", G_CALLBACK (sp_fillstroke_selection_modified), dlg ); g_signal_connect ( G_OBJECT (INKSCAPE), "activate_desktop", G_CALLBACK (sp_fillstroke_selection_changed), dlg ); + + /* Blur */ +/* uncomment to display blur slider*/ +/* GtkWidget *b_vb = gtk_vbox_new (FALSE, 0); + gtk_box_pack_start (GTK_BOX (vb), b_vb, FALSE, FALSE, 2); + gtk_object_set_data (GTK_OBJECT (dlg), "blur", b_vb); + + GtkWidget *blur_l_hb = gtk_hbox_new (FALSE, 4); + GtkWidget *blur_l = gtk_label_new_with_mnemonic (_("_Blur")); + gtk_misc_set_alignment (GTK_MISC (blur_l), 0.0, 1.0); + gtk_box_pack_start (GTK_BOX (blur_l_hb), blur_l, FALSE, FALSE, 4); + gtk_box_pack_start (GTK_BOX (b_vb), blur_l_hb, FALSE, FALSE, 0); + + GtkWidget *blur_hb = gtk_hbox_new (FALSE, 4); + gtk_box_pack_start (GTK_BOX (b_vb), blur_hb, FALSE, FALSE, 0); + + GtkObject *blur_a = gtk_adjustment_new (0.0, 0.0, 1.0, 0.01, 0.1, 0.0); + gtk_object_set_data(GTK_OBJECT(dlg), "blur_adjustment", blur_a); + + GtkWidget *blur_s = gtk_hscale_new (GTK_ADJUSTMENT (blur_a)); + gtk_scale_set_draw_value (GTK_SCALE (blur_s), FALSE); + gtk_box_pack_start (GTK_BOX (blur_hb), blur_s, TRUE, TRUE, 4); + gtk_label_set_mnemonic_widget (GTK_LABEL(blur_l), blur_s); + + GtkWidget *blur_sb = gtk_spin_button_new (GTK_ADJUSTMENT (blur_a), 0.01, 3); + gtk_box_pack_start (GTK_BOX (blur_hb), blur_sb, FALSE, FALSE, 0); + + gtk_signal_connect ( blur_a, "value_changed", + GTK_SIGNAL_FUNC (sp_fillstroke_blur_changed), + dlg ); + + gtk_widget_show_all (b_vb); +*/ sp_fillstroke_selection_changed(NULL, NULL, NULL); gtk_widget_show (dlg); @@ -314,6 +350,113 @@ sp_fillstroke_opacity_changed (GtkAdjustment *a, SPWidget *dlg) } + +/** + * Creates new private filter for the given vector + */ + +static SPFilter * +sp_filter_get(SPDocument *document, gdouble stdDeviation) +{ + g_return_val_if_fail(document != NULL, NULL); + + SPDefs *defs = (SPDefs *) SP_DOCUMENT_DEFS(document); + + // create a new private filter of the requested type + Inkscape::XML::Node *repr; + repr = sp_repr_new("svg:filter"); + // privates are garbage-collectable + repr->setAttribute("inkscape:collect", "always"); + + Inkscape::XML::Node *b_repr; + b_repr = sp_repr_new("svg:feGaussianBlur"); + // privates are garbage-collectable + b_repr->setAttribute("inkscape:collect", "always"); + + + Inkscape::CSSOStringStream os; + os << CLAMP (stdDeviation, 0.0, 1.0); + b_repr->setAttribute("stdDeviation", os.str().c_str()); + + repr->appendChild(b_repr); + Inkscape::GC::release(b_repr); + + /* Append the new private filter to defs */ + SP_OBJECT_REPR(defs)->appendChild(repr); + Inkscape::GC::release(repr); + + // get corresponding object + SPFilter *f = (SPFilter *) document->getObjectByRepr(repr); + g_assert(f != NULL); + g_assert(SP_IS_FILTER(f)); + + return f; +} + +/* + * TODO: check if selection has a filter applied and change its parameters instead of creating a new one + */ +static void +sp_fillstroke_blur_changed (GtkAdjustment *a, SPWidget *dlg) +{ + //if dialog is locked, return + if (gtk_object_get_data (GTK_OBJECT (dlg), "blocked")) + return; + + //lock dialog + gtk_object_set_data (GTK_OBJECT (dlg), "blocked", GUINT_TO_POINTER (TRUE)); + + //get desktop + SPDesktop *desktop = SP_ACTIVE_DESKTOP; + if (!desktop) { + return; + } + + if(a->value==0.0) //blur set to zero, remove filter + { + //if there is a filter attached, remove it + SPCSSAttr *css = sp_repr_css_attr_new (); + sp_repr_css_unset_property (css, "filter"); + sp_desktop_set_style (desktop, css); + sp_repr_css_attr_unref (css); + + } else { //blur non-zero + + //get current selection + Inkscape::Selection *selection = sp_desktop_selection (desktop); + //get list of selected items + GSList const *items = selection->itemList(); + //get current document + SPDocument *document = sp_desktop_document (desktop); + + + //create new filter with feGaussianBlur primitive + SPFilter *constructed = sp_filter_get(document, a->value); + + //apply created filter to every selected item + for (GSList const *i = items; i != NULL; i = i->next) { + + gchar *val = g_strdup_printf("url(#%s)", SP_OBJECT_ID(constructed)); + + SPCSSAttr *css = sp_repr_css_attr_new(); + sp_repr_css_set_property(css, "filter", val); + g_free(val); + sp_repr_css_change_recursive(SP_OBJECT_REPR(SP_ITEM(i->data)), css, "style"); + + sp_desktop_set_style (SP_ACTIVE_DESKTOP, css); + sp_repr_css_attr_unref(css); + + SP_OBJECT(SP_ITEM(i->data))->requestDisplayUpdate(( SP_OBJECT_MODIFIED_FLAG | + SP_OBJECT_STYLE_MODIFIED_FLAG )); + } + } + + sp_document_maybe_done (sp_desktop_document (SP_ACTIVE_DESKTOP), "fillstroke:blur", SP_VERB_NONE, "object-properties.cpp:467"); + + gtk_object_set_data (GTK_OBJECT (dlg), "blocked", GUINT_TO_POINTER (FALSE)); +} + + /* Local Variables: mode:c++ |
