summaryrefslogtreecommitdiffstats
path: root/src/ui/widget/object-composite-settings.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/ui/widget/object-composite-settings.cpp')
-rw-r--r--src/ui/widget/object-composite-settings.cpp70
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;
}