diff options
Diffstat (limited to 'src/ui/widget/object-composite-settings.cpp')
| -rw-r--r-- | src/ui/widget/object-composite-settings.cpp | 70 |
1 files changed, 54 insertions, 16 deletions
diff --git a/src/ui/widget/object-composite-settings.cpp b/src/ui/widget/object-composite-settings.cpp index 4052e1d38..785cb589a 100644 --- a/src/ui/widget/object-composite-settings.cpp +++ b/src/ui/widget/object-composite-settings.cpp @@ -37,6 +37,7 @@ ObjectCompositeSettings::ObjectCompositeSettings(unsigned int verb_code, char co _blend_tag(Glib::ustring(history_prefix) + ":blend"), _blur_tag(Glib::ustring(history_prefix) + ":blur"), _opacity_tag(Glib::ustring(history_prefix) + ":opacity"), + _isolation_tag(Glib::ustring(history_prefix) + ":isolation"), _filter_modifier(flags), _blocked(false) { @@ -48,6 +49,8 @@ ObjectCompositeSettings::ObjectCompositeSettings(unsigned int verb_code, char co _filter_modifier.signal_blend_changed().connect(sigc::mem_fun(*this, &ObjectCompositeSettings::_blendBlurValueChanged)); _filter_modifier.signal_blur_changed().connect(sigc::mem_fun(*this, &ObjectCompositeSettings::_blendBlurValueChanged)); _filter_modifier.signal_opacity_changed().connect(sigc::mem_fun(*this, &ObjectCompositeSettings::_opacityValueChanged)); + _filter_modifier.signal_isolation_changed().connect( + sigc::mem_fun(*this, &ObjectCompositeSettings::_isolationValueChanged)); show_all_children(); } @@ -100,8 +103,6 @@ ObjectCompositeSettings::_blendBlurValueChanged() radius = 0; } - const Glib::ustring blendmode = _filter_modifier.get_blend_mode(); - //apply created filter to every selected item std::vector<SPObject*> sel = _subject->list(); for (std::vector<SPObject*>::const_iterator i = sel.begin() ; i != sel.end() ; ++i ) { @@ -112,18 +113,9 @@ ObjectCompositeSettings::_blendBlurValueChanged() SPItem * item = SP_ITEM(*i); SPStyle *style = item->style; g_assert(style != nullptr); - - SPCSSAttr *css = sp_repr_css_attr_new(); - - if (blendmode == "normal") { - sp_repr_css_unset_property(css, "mix-blend-mode"); - } else { - sp_repr_css_set_property(css, "mix-blend-mode", blendmode.c_str()); - } - - _subject->setCSS(css); - - sp_repr_css_attr_unref(css); + item->style->mix_blend_mode.set = TRUE; + item->style->mix_blend_mode.value = _filter_modifier.get_blend_mode(); + item->updateRepr(SP_OBJECT_WRITE_NO_CHILDREN | SP_OBJECT_WRITE_EXT); if (radius == 0 && item->style->filter.set && filter_is_single_gaussian_blur(SP_FILTER(item->style->getFilter()))) { @@ -183,6 +175,35 @@ ObjectCompositeSettings::_opacityValueChanged() _blocked = false; } +void ObjectCompositeSettings::_isolationValueChanged() +{ + if (!_subject) { + return; + } + + SPDesktop *desktop = _subject->getDesktop(); + if (!desktop) { + return; + } + + if (_blocked) + return; + _blocked = true; + + for (auto item : _subject->list()) { + item->style->isolation.set = TRUE; + item->style->isolation.value = _filter_modifier.get_isolation_mode(); + item->updateRepr(SP_OBJECT_WRITE_NO_CHILDREN | SP_OBJECT_WRITE_EXT); + } + + DocumentUndo::maybeDone(desktop->getDocument(), _isolation_tag.c_str(), _verb_code, _("Change isolation")); + + // resume interruptibility + // sp_canvas_end_forced_full_redraws(desktop->getCanvas()); + + _blocked = false; +} + void ObjectCompositeSettings::_subjectChanged() { if (!_subject) { @@ -211,16 +232,33 @@ ObjectCompositeSettings::_subjectChanged() { } //query now for current filter mode and average blurring of selection + const int isolation_result = _subject->queryStyle(&query, QUERY_STYLE_PROPERTY_ISOLATION); + switch (isolation_result) { + case QUERY_STYLE_NOTHING: + _filter_modifier.set_isolation_mode(SP_CSS_ISOLATION_AUTO, false); + break; + case QUERY_STYLE_SINGLE: + case QUERY_STYLE_MULTIPLE_SAME: + _filter_modifier.set_isolation_mode(query.isolation.value, true); // here dont work mix_blend_mode.set + break; + case QUERY_STYLE_MULTIPLE_DIFFERENT: + _filter_modifier.set_isolation_mode(SP_CSS_ISOLATION_AUTO, false); + // TODO: set text + break; + } + + // query now for current filter mode and average blurring of selection const int blend_result = _subject->queryStyle(&query, QUERY_STYLE_PROPERTY_BLEND); switch(blend_result) { case QUERY_STYLE_NOTHING: + _filter_modifier.set_blend_mode(0, false); break; case QUERY_STYLE_SINGLE: case QUERY_STYLE_MULTIPLE_SAME: - _filter_modifier.set_blend_mode(query.mix_blend_mode.value); // here dont work mix_blend_mode.set + _filter_modifier.set_blend_mode(query.mix_blend_mode.value, true); // here dont work mix_blend_mode.set break; case QUERY_STYLE_MULTIPLE_DIFFERENT: - // TODO: set text + _filter_modifier.set_blend_mode(0, false); break; } |
