summaryrefslogtreecommitdiffstats
path: root/src/ui/widget
diff options
context:
space:
mode:
authorJabier Arraiza <jabier.arraiza@marker.es>2019-10-19 04:33:22 +0000
committerJabier Arraiza <jabier.arraiza@marker.es>2019-10-19 04:33:22 +0000
commit2d7e690eb6a2add552b84370d56d56ec1b1fbfd4 (patch)
treef5b76e1fbe3e2cf144d24697ce37018bf0401b86 /src/ui/widget
parentUpdate hr.po for Inkscape 1.0 (diff)
downloadinkscape-2d7e690eb6a2add552b84370d56d56ec1b1fbfd4.tar.gz
inkscape-2d7e690eb6a2add552b84370d56d56ec1b1fbfd4.zip
Add export/import PDF blend modes and add isolation modifier
Diffstat (limited to 'src/ui/widget')
-rw-r--r--src/ui/widget/filter-effect-chooser.cpp50
-rw-r--r--src/ui/widget/filter-effect-chooser.h38
-rw-r--r--src/ui/widget/object-composite-settings.cpp70
-rw-r--r--src/ui/widget/object-composite-settings.h3
4 files changed, 121 insertions, 40 deletions
diff --git a/src/ui/widget/filter-effect-chooser.cpp b/src/ui/widget/filter-effect-chooser.cpp
index 98074d354..08a3a3750 100644
--- a/src/ui/widget/filter-effect-chooser.cpp
+++ b/src/ui/widget/filter-effect-chooser.cpp
@@ -54,9 +54,11 @@ namespace Widget {
SimpleFilterModifier::SimpleFilterModifier(int flags)
: _flags(flags)
, _lb_blend(_("Blend mode:"))
+ , _lb_isolation("Isolate") // Translate for 1.1
, _blend(SPBlendModeConverter, SP_ATTR_INVALID, false)
, _blur(_("Blur (%)"), 0, 0, 100, 1, 0.1, 1)
, _opacity(_("Opacity (%)"), 0, 0, 100, 1, 0.1, 1)
+ , _notify(true)
{
set_name("SimpleFilterModifier");
@@ -72,6 +74,13 @@ SimpleFilterModifier::SimpleFilterModifier(int flags)
_lb_blend.set_mnemonic_widget(_blend);
_hb_blend.pack_start(_lb_blend, false, false, 5);
_hb_blend.pack_start(_blend, false, false, 5);
+ if (flags & ISOLATION) {
+ _isolation.property_active() = false;
+ _hb_blend.pack_start(_isolation, false, false, 5);
+ _hb_blend.pack_start(_lb_isolation, false, false, 5);
+ }
+ _hb_blend.pack_start(_lb_blend, false, false, 5);
+ _hb_blend.pack_start(_blend, false, false, 5);
Gtk::Separator *separator = Gtk::manage(new Gtk::Separator());
separator->set_margin_top(8);
separator->set_margin_bottom(8);
@@ -90,34 +99,63 @@ SimpleFilterModifier::SimpleFilterModifier(int flags)
_blend.signal_changed().connect(signal_blend_changed());
_blur.signal_value_changed().connect(signal_blur_changed());
_opacity.signal_value_changed().connect(signal_opacity_changed());
+ _isolation.signal_toggled().connect(signal_isolation_changed());
+}
+
+sigc::signal<void> &SimpleFilterModifier::signal_isolation_changed()
+{
+ if (_notify) {
+ return _signal_isolation_changed;
+ }
+ _notify = true;
+ return _signal_null;
}
sigc::signal<void>& SimpleFilterModifier::signal_blend_changed()
{
- return _signal_blend_changed;
+ if (_notify) {
+ return _signal_blend_changed;
+ }
+ _notify = true;
+ return _signal_null;
}
sigc::signal<void>& SimpleFilterModifier::signal_blur_changed()
{
+ // we dont use notifi to block use aberaje for multiple
return _signal_blur_changed;
}
sigc::signal<void>& SimpleFilterModifier::signal_opacity_changed()
{
+ // we dont use notifi to block use averaje for multiple
return _signal_opacity_changed;
}
-const Glib::ustring SimpleFilterModifier::get_blend_mode()
+int SimpleFilterModifier::get_isolation_mode()
+{
+ return _isolation.get_active() ? SP_CSS_ISOLATION_ISOLATE : SP_CSS_ISOLATION_AUTO;
+}
+
+void SimpleFilterModifier::set_isolation_mode(const int val, bool notify)
+{
+ _notify = notify;
+ _isolation.set_active(val == SP_CSS_ISOLATION_ISOLATE);
+}
+
+int SimpleFilterModifier::get_blend_mode()
{
const Util::EnumData<SPBlendMode> *d = _blend.get_active_data();
if (d) {
- return _blend.get_active_data()->key;
- } else
- return "normal";
+ return _blend.get_active_data()->id;
+ } else {
+ return SP_CSS_BLEND_NORMAL;
+ }
}
-void SimpleFilterModifier::set_blend_mode(const int val)
+void SimpleFilterModifier::set_blend_mode(const int val, bool notify)
{
+ _notify = notify;
_blend.set_active(val);
}
diff --git a/src/ui/widget/filter-effect-chooser.h b/src/ui/widget/filter-effect-chooser.h
index 9d5953739..21b8e7c7f 100644
--- a/src/ui/widget/filter-effect-chooser.h
+++ b/src/ui/widget/filter-effect-chooser.h
@@ -15,6 +15,7 @@
*/
#include <gtkmm/box.h>
+#include <gtkmm/checkbutton.h>
#include <gtkmm/combobox.h>
#include <gtkmm/separator.h>
@@ -32,41 +33,44 @@ namespace Widget {
class SimpleFilterModifier : public Gtk::VBox
{
public:
- enum Flags {
- NONE = 0,
- BLUR = 1,
- OPACITY= 2,
- BLEND = 4
- };
+ enum Flags { NONE = 0, BLUR = 1, OPACITY = 2, BLEND = 4, ISOLATION = 16 };
- SimpleFilterModifier(int flags);
+ SimpleFilterModifier(int flags);
- sigc::signal<void>& signal_blend_changed();
- sigc::signal<void>& signal_blur_changed();
- sigc::signal<void>& signal_opacity_changed();
+ sigc::signal<void> &signal_blend_changed();
+ sigc::signal<void> &signal_blur_changed();
+ sigc::signal<void> &signal_opacity_changed();
+ sigc::signal<void> &signal_isolation_changed();
- const Glib::ustring get_blend_mode();
- // Uses blend mode enum values, or -1 for a complex filter
- void set_blend_mode(const int);
+ int get_isolation_mode();
+ void set_isolation_mode(const int, bool notifi);
- double get_blur_value() const;
- void set_blur_value(const double);
+ int get_blend_mode();
+ void set_blend_mode(const int, bool notifi);
- double get_opacity_value() const;
- void set_opacity_value(const double);
+ double get_blur_value() const;
+ void set_blur_value(const double);
+
+ double get_opacity_value() const;
+ void set_opacity_value(const double);
private:
int _flags;
+ bool _notify;
Gtk::HBox _hb_blend;
Gtk::Label _lb_blend;
+ Gtk::Label _lb_isolation;
ComboBoxEnum<SPBlendMode> _blend;
SpinScale _blur;
SpinScale _opacity;
+ Gtk::CheckButton _isolation;
+ sigc::signal<void> _signal_null;
sigc::signal<void> _signal_blend_changed;
sigc::signal<void> _signal_blur_changed;
sigc::signal<void> _signal_opacity_changed;
+ sigc::signal<void> _signal_isolation_changed;
};
}
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;
}
diff --git a/src/ui/widget/object-composite-settings.h b/src/ui/widget/object-composite-settings.h
index 8e57bbf0c..96501185a 100644
--- a/src/ui/widget/object-composite-settings.h
+++ b/src/ui/widget/object-composite-settings.h
@@ -45,6 +45,7 @@ private:
Glib::ustring _blend_tag;
Glib::ustring _blur_tag;
Glib::ustring _opacity_tag;
+ Glib::ustring _isolation_tag;
StyleSubject *_subject;
@@ -59,7 +60,7 @@ private:
void _subjectChanged();
void _blendBlurValueChanged();
void _opacityValueChanged();
-
+ void _isolationValueChanged();
};
}