From 526c8bf9bb41b582dc49f54ac192705de9e2edf2 Mon Sep 17 00:00:00 2001 From: mental Date: Tue, 1 Jan 2008 04:40:04 +0000 Subject: [PATCH] factor filter and opacity controls into separate metawidget --- src/ui/dialog/fill-and-stroke.cpp | 226 +--------------- src/ui/dialog/fill-and-stroke.h | 19 +- src/ui/widget/Makefile_insert | 2 + src/ui/widget/object-composite-settings.cpp | 281 ++++++++++++++++++++ src/ui/widget/object-composite-settings.h | 85 ++++++ 5 files changed, 372 insertions(+), 241 deletions(-) create mode 100644 src/ui/widget/object-composite-settings.cpp create mode 100644 src/ui/widget/object-composite-settings.h diff --git a/src/ui/dialog/fill-and-stroke.cpp b/src/ui/dialog/fill-and-stroke.cpp index ab25f5bb3..d4c216187 100644 --- a/src/ui/dialog/fill-and-stroke.cpp +++ b/src/ui/dialog/fill-and-stroke.cpp @@ -29,7 +29,6 @@ #include "xml/repr.h" #include "widgets/icon.h" - #include "dialogs/fill-style.h" #include "dialogs/stroke-style.h" @@ -39,36 +38,11 @@ namespace Inkscape { namespace UI { namespace Dialog { -void on_selection_changed(Inkscape::Application *inkscape, - Inkscape::Selection *selection, - FillAndStroke *dlg) -{ - dlg->selectionChanged(inkscape, selection); -} - -void on_selection_modified(Inkscape::Application *inkscape, - Inkscape::Selection *selection, - guint /*flags*/, - FillAndStroke *dlg) -{ - dlg->selectionChanged(inkscape, selection); -} - - FillAndStroke::FillAndStroke() : UI::Widget::Panel ("", "dialogs.fillstroke", SP_VERB_DIALOG_FILL_STROKE), _page_fill(1, 1, true, true), _page_stroke_paint(1, 1, true, true), - _page_stroke_style(1, 1, true, true), - _fe_vbox(false, 0), - _fe_alignment(1, 1, 1, 1), - _opacity_vbox(false, 0), - _opacity_label_box(false, 0), - _opacity_label(_("Opacity, %"), 0.0, 1.0, true), - _opacity_adjustment(100.0, 0.0, 100.0, 1.0, 1.0, 0.0), - _opacity_hscale(_opacity_adjustment), - _opacity_spin_button(_opacity_adjustment, 0.01, 1), - _blocked(false) + _page_stroke_style(1, 1, true, true) { Gtk::Box *contents = _getContents(); contents->set_spacing(0); @@ -83,31 +57,7 @@ FillAndStroke::FillAndStroke() _layoutPageStrokePaint(); _layoutPageStrokeStyle(); - // Filter Effects - contents->pack_start(_fe_vbox, false, false, 2); - _fe_alignment.set_padding(0, 0, 4, 0); - _fe_alignment.add(_fe_cb); - _fe_vbox.pack_start(_fe_alignment, false, false, 0); - - _fe_cb.signal_blend_blur_changed().connect(sigc::mem_fun(*this, &Inkscape::UI::Dialog::FillAndStroke::_blendBlurValueChanged)); - - // Opacity - contents->pack_start(_opacity_vbox, false, false, 2); - _opacity_label_box.pack_start(_opacity_label, false, false, 4); - _opacity_vbox.pack_start(_opacity_label_box, false, false, 0); - _opacity_vbox.pack_start(_opacity_hbox, false, false, 0); - _opacity_hbox.pack_start(_opacity_hscale, true, true, 4); - _opacity_hbox.pack_start(_opacity_spin_button, false, false, 0); - _opacity_hscale.set_draw_value(false); - _opacity_adjustment.signal_value_changed().connect(sigc::mem_fun(*this, &Inkscape::UI::Dialog::FillAndStroke::_opacityValueChanged)); - - // these callbacks are only for the blur and master opacity update; the tabs above take care of themselves - g_signal_connect ( G_OBJECT (INKSCAPE), "change_selection", G_CALLBACK (on_selection_changed), this ); - g_signal_connect ( G_OBJECT (INKSCAPE), "change_subselection", G_CALLBACK (on_selection_changed), this ); - g_signal_connect ( G_OBJECT (INKSCAPE), "modify_selection", G_CALLBACK (on_selection_modified), this ); - g_signal_connect ( G_OBJECT (INKSCAPE), "activate_desktop", G_CALLBACK (on_selection_changed), this ); - - selectionChanged(INKSCAPE, sp_desktop_selection(getDesktop())); + contents->pack_start(_composite_settings, false, false, 0); show_all_children(); } @@ -158,178 +108,6 @@ FillAndStroke::showPageStrokeStyle() _notebook.set_current_page(2); } - -void -FillAndStroke::_blendBlurValueChanged() -{ - if (_blocked) - return; - _blocked = true; - - //get desktop - SPDesktop *desktop = getDesktop(); - if (!desktop) { - return; - } - - // FIXME: fix for GTK breakage, see comment in SelectedStyle::on_opacity_changed; here it results in crash 1580903 - sp_canvas_force_full_redraw_after_interruptions(sp_desktop_canvas(desktop), 0); - - //get current selection - Inkscape::Selection *selection = sp_desktop_selection (desktop); - - NR::Maybe bbox = selection->bounds(); - if (!bbox) { - return; - } - //get list of selected items - GSList const *items = selection->itemList(); - //get current document - SPDocument *document = sp_desktop_document (desktop); - - double perimeter = bbox->extent(NR::X) + bbox->extent(NR::Y); - - const Glib::ustring blendmode = _fe_cb.get_blend_mode(); - double radius = _fe_cb.get_blur_value() * perimeter / 400; - - SPFilter *filter = 0; - const bool remfilter = (blendmode == "normal" && radius == 0) || (blendmode == "filter" && !filter); - - if(blendmode != "filter" || filter) { - //apply created filter to every selected item - for (GSList const *i = items; i != NULL; i = i->next) { - SPItem * item = SP_ITEM(i->data); - SPStyle *style = SP_OBJECT_STYLE(item); - g_assert(style != NULL); - - if(remfilter) { - remove_filter (item, false); - } - else { - if(blendmode != "filter") - filter = new_filter_simple_from_item(document, item, blendmode.c_str(), radius); - sp_style_set_property_url (SP_OBJECT(item), "filter", SP_OBJECT(filter), false); - } - - //request update - SP_OBJECT(item)->requestDisplayUpdate(( SP_OBJECT_MODIFIED_FLAG | - SP_OBJECT_STYLE_MODIFIED_FLAG )); - } - } - - sp_document_maybe_done (sp_desktop_document (desktop), "fillstroke:blur", SP_VERB_DIALOG_FILL_STROKE, _("Change blur")); - - // resume interruptibility - sp_canvas_end_forced_full_redraws(sp_desktop_canvas(desktop)); - - _blocked = false; -} - -void -FillAndStroke::_opacityValueChanged() -{ - if (_blocked) - return; - _blocked = true; - - SPDesktop *desktop = getDesktop(); - - // FIXME: fix for GTK breakage, see comment in SelectedStyle::on_opacity_changed; here it results in crash 1580903 - // UPDATE: crash fixed in GTK+ 2.10.7 (bug 374378), remove this as soon as it's reasonably common - // (though this only fixes the crash, not the multiple change events) - sp_canvas_force_full_redraw_after_interruptions(sp_desktop_canvas(desktop), 0); - - SPCSSAttr *css = sp_repr_css_attr_new (); - - Inkscape::CSSOStringStream os; - os << CLAMP (_opacity_adjustment.get_value() / 100, 0.0, 1.0); - sp_repr_css_set_property (css, "opacity", os.str().c_str()); - - sp_desktop_set_style (desktop, css); - - sp_repr_css_attr_unref (css); - - sp_document_maybe_done (sp_desktop_document (desktop), "fillstroke:opacity", SP_VERB_DIALOG_FILL_STROKE, - _("Change opacity")); - - // resume interruptibility - sp_canvas_end_forced_full_redraws(sp_desktop_canvas(desktop)); - - _blocked = false; -} - -void -FillAndStroke::selectionChanged(Inkscape::Application */*inkscape*/, - Inkscape::Selection */*selection*/) -{ - if (_blocked) - return; - _blocked = true; - - SPDesktop *desktop = getDesktop(); - - // create temporary style - SPStyle *query = sp_style_new (sp_desktop_document(desktop)); - // query style from desktop into it. This returns a result flag and fills query with the style of subselection, if any, or selection - int result = sp_desktop_query_style (desktop, query, QUERY_STYLE_PROPERTY_MASTEROPACITY); - - switch (result) { - case QUERY_STYLE_NOTHING: - _opacity_hbox.set_sensitive(false); - // gtk_widget_set_sensitive (opa, FALSE); - break; - case QUERY_STYLE_SINGLE: - case QUERY_STYLE_MULTIPLE_AVERAGED: // TODO: treat this slightly differently - case QUERY_STYLE_MULTIPLE_SAME: - _opacity_hbox.set_sensitive(true); - _opacity_adjustment.set_value(100 * SP_SCALE24_TO_FLOAT(query->opacity.value)); - break; - } - - //query now for current filter mode and average blurring of selection - const int blend_result = sp_desktop_query_style (desktop, query, QUERY_STYLE_PROPERTY_BLEND); - switch(blend_result) { - case QUERY_STYLE_NOTHING: - _fe_cb.set_sensitive(false); - break; - case QUERY_STYLE_SINGLE: - case QUERY_STYLE_MULTIPLE_SAME: - _fe_cb.set_blend_mode(query->filter_blend_mode.value); - _fe_cb.set_sensitive(true); - break; - case QUERY_STYLE_MULTIPLE_DIFFERENT: - // TODO: set text - _fe_cb.set_sensitive(false); - break; - } - - if(blend_result == QUERY_STYLE_SINGLE || blend_result == QUERY_STYLE_MULTIPLE_SAME) { - int blur_result = sp_desktop_query_style (desktop, query, QUERY_STYLE_PROPERTY_BLUR); - switch (blur_result) { - case QUERY_STYLE_NOTHING: //no blurring - _fe_cb.set_blur_sensitive(false); - break; - case QUERY_STYLE_SINGLE: - case QUERY_STYLE_MULTIPLE_AVERAGED: - case QUERY_STYLE_MULTIPLE_SAME: - NR::Maybe bbox = sp_desktop_selection(desktop)->bounds(); - if (bbox) { - double perimeter = bbox->extent(NR::X) + bbox->extent(NR::Y); - _fe_cb.set_blur_sensitive(true); - //update blur widget value - float radius = query->filter_gaussianBlur_deviation.value; - float percent = radius * 400 / perimeter; // so that for a square, 100% == half side - _fe_cb.set_blur_value(percent); - } - break; - } - } - - sp_style_unref(query); - - _blocked = false; -} - Gtk::HBox& FillAndStroke::_createPageTabLabel(const Glib::ustring& label, const char *label_image) { diff --git a/src/ui/dialog/fill-and-stroke.h b/src/ui/dialog/fill-and-stroke.h index f2313adae..ee8c32b4f 100644 --- a/src/ui/dialog/fill-and-stroke.h +++ b/src/ui/dialog/fill-and-stroke.h @@ -23,7 +23,7 @@ #include "ui/widget/panel.h" #include "ui/widget/notebook-page.h" -#include "ui/widget/filter-effect-chooser.h" +#include "ui/widget/object-composite-settings.h" using namespace Inkscape::UI::Widget; @@ -52,30 +52,15 @@ protected: NotebookPage _page_stroke_paint; NotebookPage _page_stroke_style; - Gtk::VBox _fe_vbox; - Gtk::Alignment _fe_alignment; - - Gtk::VBox _opacity_vbox; - Gtk::HBox _opacity_label_box; - Gtk::HBox _opacity_hbox; - Gtk::Label _opacity_label; - Gtk::Adjustment _opacity_adjustment; - Gtk::HScale _opacity_hscale; - Gtk::SpinButton _opacity_spin_button; + ObjectCompositeSettings _composite_settings; Gtk::HBox &_createPageTabLabel(const Glib::ustring &label, const char *label_image); - SimpleFilterModifier _fe_cb; void _layoutPageFill(); void _layoutPageStrokePaint(); void _layoutPageStrokeStyle(); - void _blendBlurValueChanged(); - void _opacityValueChanged(); - - bool _blocked; - private: FillAndStroke(FillAndStroke const &d); FillAndStroke& operator=(FillAndStroke const &d); diff --git a/src/ui/widget/Makefile_insert b/src/ui/widget/Makefile_insert index 33a65effe..7661aeb8e 100644 --- a/src/ui/widget/Makefile_insert +++ b/src/ui/widget/Makefile_insert @@ -38,6 +38,8 @@ ui_widget_libuiwidget_a_SOURCES = \ ui/widget/licensor.h \ ui/widget/notebook-page.cpp \ ui/widget/notebook-page.h \ + ui/widget/object-composite-settings.cpp \ + ui/widget/object-composite-settings.h \ ui/widget/page-sizer.cpp \ ui/widget/page-sizer.h \ ui/widget/panel.cpp \ diff --git a/src/ui/widget/object-composite-settings.cpp b/src/ui/widget/object-composite-settings.cpp new file mode 100644 index 000000000..65458dc94 --- /dev/null +++ b/src/ui/widget/object-composite-settings.cpp @@ -0,0 +1,281 @@ +/* + * A widget for controlling object compositing (filter, opacity, etc.) + * + * Authors: + * Bryce W. Harrington + * Gustav Broberg + * + * Copyright (C) 2004--2007 Authors + * + * Released under GNU GPL, read the file 'COPYING' for more information + */ + +#include + +#include "desktop-handles.h" +#include "desktop-style.h" +#include "document.h" +#include "filter-chemistry.h" +#include "inkscape.h" +#include "inkscape-stock.h" +#include "selection.h" +#include "style.h" +#include "svg/css-ostringstream.h" +#include "verbs.h" +#include "xml/repr.h" +#include "widgets/icon.h" +#include "ui/widget/object-composite-settings.h" +#include "display/sp-canvas.h" + +namespace Inkscape { +namespace UI { +namespace Widget { + +void ObjectCompositeSettings::on_selection_changed( + Inkscape::Application *inkscape, + Inkscape::Selection *selection, + ObjectCompositeSettings *w +) { + w->selectionChanged(inkscape, selection); +} + +void ObjectCompositeSettings::on_selection_modified( + Inkscape::Application *inkscape, + Inkscape::Selection *selection, + guint /*flags*/, + ObjectCompositeSettings *w +) { + w->selectionChanged(inkscape, selection); +} + +ObjectCompositeSettings::ObjectCompositeSettings() +: _fe_vbox(false, 0), + _fe_alignment(1, 1, 1, 1), + _opacity_vbox(false, 0), + _opacity_label_box(false, 0), + _opacity_label(_("Opacity, %"), 0.0, 1.0, true), + _opacity_adjustment(100.0, 0.0, 100.0, 1.0, 1.0, 0.0), + _opacity_hscale(_opacity_adjustment), + _opacity_spin_button(_opacity_adjustment, 0.01, 1), + _blocked(false) +{ + // Filter Effects + pack_start(_fe_vbox, false, false, 2); + _fe_alignment.set_padding(0, 0, 4, 0); + _fe_alignment.add(_fe_cb); + _fe_vbox.pack_start(_fe_alignment, false, false, 0); + _fe_cb.signal_blend_blur_changed().connect(sigc::mem_fun(*this, &ObjectCompositeSettings::_blendBlurValueChanged)); + + // Opacity + pack_start(_opacity_vbox, false, false, 2); + _opacity_label_box.pack_start(_opacity_label, false, false, 4); + _opacity_vbox.pack_start(_opacity_label_box, false, false, 0); + _opacity_vbox.pack_start(_opacity_hbox, false, false, 0); + _opacity_hbox.pack_start(_opacity_hscale, true, true, 4); + _opacity_hbox.pack_start(_opacity_spin_button, false, false, 0); + _opacity_hscale.set_draw_value(false); + _opacity_adjustment.signal_value_changed().connect(sigc::mem_fun(*this, &ObjectCompositeSettings::_opacityValueChanged)); + + _sel_changed = g_signal_connect ( G_OBJECT (INKSCAPE), "change_selection", G_CALLBACK (on_selection_changed), this ); + _subsel_changed = g_signal_connect ( G_OBJECT (INKSCAPE), "change_subselection", G_CALLBACK (on_selection_changed), this ); + _sel_modified = g_signal_connect ( G_OBJECT (INKSCAPE), "modify_selection", G_CALLBACK (on_selection_modified), this ); + _desktop_activated = g_signal_connect ( G_OBJECT (INKSCAPE), "activate_desktop", G_CALLBACK (on_selection_changed), this ); + + selectionChanged(INKSCAPE, sp_desktop_selection(SP_ACTIVE_DESKTOP)); + + show_all_children(); +} + +ObjectCompositeSettings::~ObjectCompositeSettings() { + g_signal_handler_disconnect(G_OBJECT(INKSCAPE), _sel_changed); + g_signal_handler_disconnect(G_OBJECT(INKSCAPE), _subsel_changed); + g_signal_handler_disconnect(G_OBJECT(INKSCAPE), _sel_modified); + g_signal_handler_disconnect(G_OBJECT(INKSCAPE), _desktop_activated); +} + +void +ObjectCompositeSettings::_blendBlurValueChanged() +{ + if (_blocked) + return; + _blocked = true; + + //get desktop + SPDesktop *desktop = SP_ACTIVE_DESKTOP; + if (!desktop) { + return; + } + + // FIXME: fix for GTK breakage, see comment in SelectedStyle::on_opacity_changed; here it results in crash 1580903 + sp_canvas_force_full_redraw_after_interruptions(sp_desktop_canvas(desktop), 0); + + //get current selection + Inkscape::Selection *selection = sp_desktop_selection (desktop); + + NR::Maybe bbox = selection->bounds(); + if (!bbox) { + return; + } + //get list of selected items + GSList const *items = selection->itemList(); + //get current document + SPDocument *document = sp_desktop_document (desktop); + + double perimeter = bbox->extent(NR::X) + bbox->extent(NR::Y); + + const Glib::ustring blendmode = _fe_cb.get_blend_mode(); + double radius = _fe_cb.get_blur_value() * perimeter / 400; + + SPFilter *filter = 0; + const bool remfilter = (blendmode == "normal" && radius == 0) || (blendmode == "filter" && !filter); + + if(blendmode != "filter" || filter) { + //apply created filter to every selected item + for (GSList const *i = items; i != NULL; i = i->next) { + SPItem * item = SP_ITEM(i->data); + SPStyle *style = SP_OBJECT_STYLE(item); + g_assert(style != NULL); + + + if(remfilter) { + remove_filter (item, false); + } + else { + if(blendmode != "filter") + filter = new_filter_simple_from_item(document, item, blendmode.c_str(), radius); + sp_style_set_property_url (SP_OBJECT(item), "filter", SP_OBJECT(filter), false); + } + + //request update + SP_OBJECT(item)->requestDisplayUpdate(( SP_OBJECT_MODIFIED_FLAG | + SP_OBJECT_STYLE_MODIFIED_FLAG )); + } + } + + sp_document_maybe_done (sp_desktop_document (desktop), "fillstroke:blur", SP_VERB_DIALOG_FILL_STROKE, _("Change blur")); + + // resume interruptibility + sp_canvas_end_forced_full_redraws(sp_desktop_canvas(desktop)); + + _blocked = false; +} + +void +ObjectCompositeSettings::_opacityValueChanged() +{ + if (_blocked) + return; + _blocked = true; + + SPDesktop *desktop = SP_ACTIVE_DESKTOP; + + // FIXME: fix for GTK breakage, see comment in SelectedStyle::on_opacity_changed; here it results in crash 1580903 + // UPDATE: crash fixed in GTK+ 2.10.7 (bug 374378), remove this as soon as it's reasonably common + // (though this only fixes the crash, not the multiple change events) + sp_canvas_force_full_redraw_after_interruptions(sp_desktop_canvas(desktop), 0); + + SPCSSAttr *css = sp_repr_css_attr_new (); + + Inkscape::CSSOStringStream os; + os << CLAMP (_opacity_adjustment.get_value() / 100, 0.0, 1.0); + sp_repr_css_set_property (css, "opacity", os.str().c_str()); + + sp_desktop_set_style (desktop, css); + + sp_repr_css_attr_unref (css); + + sp_document_maybe_done (sp_desktop_document (desktop), "fillstroke:opacity", SP_VERB_DIALOG_FILL_STROKE, + _("Change opacity")); + + // resume interruptibility + sp_canvas_end_forced_full_redraws(sp_desktop_canvas(desktop)); + + _blocked = false; +} + +void +ObjectCompositeSettings::selectionChanged(Inkscape::Application */*inkscape*/, + Inkscape::Selection */*selection*/) +{ + if (_blocked) + return; + _blocked = true; + + SPDesktop *desktop = SP_ACTIVE_DESKTOP; + + // create temporary style + SPStyle *query = sp_style_new (sp_desktop_document(desktop)); + // query style from desktop into it. This returns a result flag and fills query with the style of subselection, if any, or selection + int result = sp_desktop_query_style (desktop, query, QUERY_STYLE_PROPERTY_MASTEROPACITY); + + switch (result) { + case QUERY_STYLE_NOTHING: + _opacity_hbox.set_sensitive(false); + // gtk_widget_set_sensitive (opa, FALSE); + break; + case QUERY_STYLE_SINGLE: + case QUERY_STYLE_MULTIPLE_AVERAGED: // TODO: treat this slightly differently + case QUERY_STYLE_MULTIPLE_SAME: + _opacity_hbox.set_sensitive(true); + _opacity_adjustment.set_value(100 * SP_SCALE24_TO_FLOAT(query->opacity.value)); + break; + } + + //query now for current filter mode and average blurring of selection + const int blend_result = sp_desktop_query_style (desktop, query, QUERY_STYLE_PROPERTY_BLEND); + switch(blend_result) { + case QUERY_STYLE_NOTHING: + _fe_cb.set_sensitive(false); + break; + case QUERY_STYLE_SINGLE: + case QUERY_STYLE_MULTIPLE_SAME: + _fe_cb.set_blend_mode(query->filter_blend_mode.value); + _fe_cb.set_sensitive(true); + break; + case QUERY_STYLE_MULTIPLE_DIFFERENT: + // TODO: set text + _fe_cb.set_sensitive(false); + break; + } + + if(blend_result == QUERY_STYLE_SINGLE || blend_result == QUERY_STYLE_MULTIPLE_SAME) { + int blur_result = sp_desktop_query_style (desktop, query, QUERY_STYLE_PROPERTY_BLUR); + switch (blur_result) { + case QUERY_STYLE_NOTHING: //no blurring + _fe_cb.set_blur_sensitive(false); + break; + case QUERY_STYLE_SINGLE: + case QUERY_STYLE_MULTIPLE_AVERAGED: + case QUERY_STYLE_MULTIPLE_SAME: + NR::Maybe bbox = sp_desktop_selection(desktop)->bounds(); + if (bbox) { + double perimeter = bbox->extent(NR::X) + bbox->extent(NR::Y); + _fe_cb.set_blur_sensitive(true); + //update blur widget value + float radius = query->filter_gaussianBlur_deviation.value; + float percent = radius * 400 / perimeter; // so that for a square, 100% == half side + _fe_cb.set_blur_value(percent); + } + break; + } + } + + sp_style_unref(query); + + _blocked = false; +} + +} +} +} + +/* + 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:encoding=utf-8:textwidth=99 : diff --git a/src/ui/widget/object-composite-settings.h b/src/ui/widget/object-composite-settings.h new file mode 100644 index 000000000..fa007685b --- /dev/null +++ b/src/ui/widget/object-composite-settings.h @@ -0,0 +1,85 @@ +#ifndef SEEN_UI_WIDGET_OBJECT_COMPOSITE_SETTINGS_H +#define SEEN_UI_WIDGET_OBJECT_COMPOSITE_SETTINGS_H + +/* + * A widget for controlling object compositing (filter, opacity, etc.) + * + * Authors: + * Bryce W. Harrington + * Gustav Broberg + * + * Copyright (C) 2004--2007 Authors + * + * Released under GNU GPL, read the file 'COPYING' for more information + */ + +#include +#include +#include +#include +#include +#include + +#include "ui/widget/filter-effect-chooser.h" + +namespace Inkscape { +namespace UI { +namespace Widget { + +class ObjectCompositeSettings : public Gtk::VBox { +public: + ObjectCompositeSettings(); + ~ObjectCompositeSettings(); + +private: + Gtk::VBox _opacity_vbox; + Gtk::HBox _opacity_label_box; + Gtk::HBox _opacity_hbox; + Gtk::Label _opacity_label; + Gtk::Adjustment _opacity_adjustment; + Gtk::HScale _opacity_hscale; + Gtk::SpinButton _opacity_spin_button; + + SimpleFilterModifier _fe_cb; + Gtk::VBox _fe_vbox; + Gtk::Alignment _fe_alignment; + + void selectionChanged(Inkscape::Application *inkscape, + Inkscape::Selection *selection); + + static void on_selection_changed(Inkscape::Application *inkscape, + Inkscape::Selection *selection, + ObjectCompositeSettings *w); + + static void on_selection_modified(Inkscape::Application *inkscape, + Inkscape::Selection *selection, + guint flags, + ObjectCompositeSettings *w); + + void _blendBlurValueChanged(); + void _opacityValueChanged(); + + bool _blocked; + + gulong _sel_changed; + gulong _subsel_changed; + gulong _sel_modified; + gulong _desktop_activated; +}; + +} +} +} + +#endif + +/* + 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:encoding=utf-8:textwidth=99 : -- 2.30.2