X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Fui%2Fdialog%2Ffill-and-stroke.cpp;h=a05c20b36da15491a45e8ca3f7418da10748a887;hb=9acbda558d50be3b21e4b384be758bc12a461072;hp=4f32d3d91df7be99afff404d479597fffba13737;hpb=963f23115db07f460bdd862b957f8bd9dba88b9b;p=inkscape.git diff --git a/src/ui/dialog/fill-and-stroke.cpp b/src/ui/dialog/fill-and-stroke.cpp index 4f32d3d91..a05c20b36 100644 --- a/src/ui/dialog/fill-and-stroke.cpp +++ b/src/ui/dialog/fill-and-stroke.cpp @@ -1,8 +1,9 @@ -/** - * \brief Fill and Stroke dialog, - * based on sp_object_properties_dialog +/** @file + * @brief Fill and Stroke dialog - implementation * - * Authors: + * Based on the old sp_object_properties_dialog. + */ +/* Authors: * Bryce W. Harrington * Gustav Broberg * @@ -11,10 +12,6 @@ * Released under GNU GPL. Read the file 'COPYING' for more information. */ -#ifdef HAVE_CONFIG_H -# include -#endif - #include "desktop-handles.h" #include "desktop-style.h" #include "document.h" @@ -29,7 +26,6 @@ #include "xml/repr.h" #include "widgets/icon.h" - #include "dialogs/fill-style.h" #include "dialogs/stroke-style.h" @@ -39,36 +35,12 @@ 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), + : 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) + _composite_settings(SP_VERB_DIALOG_FILL_STROKE, "fillstroke", SimpleFilterModifier::BLUR) { Gtk::Box *contents = _getContents(); contents->set_spacing(0); @@ -83,37 +55,16 @@ 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(SP_ACTIVE_DESKTOP)); + contents->pack_start(_composite_settings, false, false, 0); show_all_children(); + + _composite_settings.setSubject(&_subject); } FillAndStroke::~FillAndStroke() { + _composite_settings.setSubject(NULL); } void @@ -133,7 +84,9 @@ FillAndStroke::_layoutPageStrokePaint() void FillAndStroke::_layoutPageStrokeStyle() { - Gtk::Widget *ssl = manage(Glib::wrap(sp_stroke_style_line_widget_new())); + //Gtk::Widget *ssl = manage(Glib::wrap(sp_stroke_style_line_widget_new())); + //Gtk::Widget *ssl = static_cast(sp_stroke_style_line_widget_new()); + Gtk::Widget *ssl = sp_stroke_style_line_widget_new(); _page_stroke_style.table().attach(*ssl, 0, 1, 0, 1); } @@ -158,174 +111,6 @@ FillAndStroke::showPageStrokeStyle() _notebook.set_current_page(2); } - -void -FillAndStroke::_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 (SP_ACTIVE_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; - - // 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(SP_ACTIVE_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 (SP_ACTIVE_DESKTOP, css); - - sp_repr_css_attr_unref (css); - - sp_document_maybe_done (sp_desktop_document (SP_ACTIVE_DESKTOP), "fillstroke:opacity", SP_VERB_DIALOG_FILL_STROKE, - _("Change opacity")); - - // resume interruptibility - sp_canvas_end_forced_full_redraws(sp_desktop_canvas(SP_ACTIVE_DESKTOP)); - - _blocked = false; -} - -void -FillAndStroke::selectionChanged(Inkscape::Application */*inkscape*/, - Inkscape::Selection */*selection*/) -{ - if (_blocked) - return; - _blocked = true; - - // create temporary style - SPStyle *query = sp_style_new (SP_ACTIVE_DOCUMENT); - // 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 (SP_ACTIVE_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 (SP_ACTIVE_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 (SP_ACTIVE_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(SP_ACTIVE_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) {