diff options
| author | MenTaLguY <mental@rydia.net> | 2008-01-01 04:40:04 +0000 |
|---|---|---|
| committer | mental <mental@users.sourceforge.net> | 2008-01-01 04:40:04 +0000 |
| commit | 6ceb3f625dadcefd11d0612a8602fe83209df0b3 (patch) | |
| tree | 3db5476e8d82f7afead9b4d3b626e5e67372a109 /src/ui/dialog | |
| parent | whitespace cleanup (diff) | |
| download | inkscape-6ceb3f625dadcefd11d0612a8602fe83209df0b3.tar.gz inkscape-6ceb3f625dadcefd11d0612a8602fe83209df0b3.zip | |
factor filter and opacity controls into separate metawidget
(bzr r4352)
Diffstat (limited to 'src/ui/dialog')
| -rw-r--r-- | src/ui/dialog/fill-and-stroke.cpp | 226 | ||||
| -rw-r--r-- | src/ui/dialog/fill-and-stroke.h | 19 |
2 files changed, 4 insertions, 241 deletions
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<NR::Rect> 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<NR::Rect> 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); |
