diff options
| author | Jabier Arraiza <jabier.arraiza@marker.es> | 2019-10-19 04:33:22 +0000 |
|---|---|---|
| committer | Jabier Arraiza <jabier.arraiza@marker.es> | 2019-10-19 04:33:22 +0000 |
| commit | 2d7e690eb6a2add552b84370d56d56ec1b1fbfd4 (patch) | |
| tree | f5b76e1fbe3e2cf144d24697ce37018bf0401b86 /src/ui | |
| parent | Update hr.po for Inkscape 1.0 (diff) | |
| download | inkscape-2d7e690eb6a2add552b84370d56d56ec1b1fbfd4.tar.gz inkscape-2d7e690eb6a2add552b84370d56d56ec1b1fbfd4.zip | |
Add export/import PDF blend modes and add isolation modifier
Diffstat (limited to 'src/ui')
| -rw-r--r-- | src/ui/dialog/fill-and-stroke.cpp | 1 | ||||
| -rw-r--r-- | src/ui/dialog/layers.cpp | 1 | ||||
| -rw-r--r-- | src/ui/dialog/objects.cpp | 61 | ||||
| -rw-r--r-- | src/ui/dialog/objects.h | 10 | ||||
| -rw-r--r-- | src/ui/tools/node-tool.cpp | 5 | ||||
| -rw-r--r-- | src/ui/tools/select-tool.cpp | 1 | ||||
| -rw-r--r-- | src/ui/widget/filter-effect-chooser.cpp | 50 | ||||
| -rw-r--r-- | src/ui/widget/filter-effect-chooser.h | 38 | ||||
| -rw-r--r-- | src/ui/widget/object-composite-settings.cpp | 70 | ||||
| -rw-r--r-- | src/ui/widget/object-composite-settings.h | 3 |
10 files changed, 176 insertions, 64 deletions
diff --git a/src/ui/dialog/fill-and-stroke.cpp b/src/ui/dialog/fill-and-stroke.cpp index 22dd407e7..fd28cbc87 100644 --- a/src/ui/dialog/fill-and-stroke.cpp +++ b/src/ui/dialog/fill-and-stroke.cpp @@ -46,6 +46,7 @@ FillAndStroke::FillAndStroke() , _page_stroke_paint(Gtk::manage(new UI::Widget::NotebookPage(1, 1, true, true))) , _page_stroke_style(Gtk::manage(new UI::Widget::NotebookPage(1, 1, true, true))) , _composite_settings(SP_VERB_DIALOG_FILL_STROKE, "fillstroke", + UI::Widget::SimpleFilterModifier::ISOLATION | UI::Widget::SimpleFilterModifier::BLEND | UI::Widget::SimpleFilterModifier::BLUR | UI::Widget::SimpleFilterModifier::OPACITY) diff --git a/src/ui/dialog/layers.cpp b/src/ui/dialog/layers.cpp index e2aa4e2c9..06af29a6e 100644 --- a/src/ui/dialog/layers.cpp +++ b/src/ui/dialog/layers.cpp @@ -740,6 +740,7 @@ LayersPanel::LayersPanel() : _pending(nullptr), _toggleEvent(nullptr), _compositeSettings(SP_VERB_DIALOG_LAYERS, "layers", + UI::Widget::SimpleFilterModifier::ISOLATION | UI::Widget::SimpleFilterModifier::BLEND | UI::Widget::SimpleFilterModifier::OPACITY | UI::Widget::SimpleFilterModifier::BLUR), diff --git a/src/ui/dialog/objects.cpp b/src/ui/dialog/objects.cpp index 272d98595..8682cfd0c 100644 --- a/src/ui/dialog/objects.cpp +++ b/src/ui/dialog/objects.cpp @@ -577,17 +577,20 @@ void ObjectsPanel::_objectsSelected( Selection *sel ) { void ObjectsPanel::_setCompositingValues(SPItem *item) { // Block the connections to avoid interference + _isolationConnection.block(); _opacityConnection.block(); _blendConnection.block(); _blurConnection.block(); + // Set the isolation + int isolation = item->style->isolation.set ? item->style->isolation.value : SP_CSS_ISOLATION_AUTO; + _filter_modifier.set_isolation_mode(isolation, true); // Set the opacity double opacity = (item->style->opacity.set ? SP_SCALE24_TO_FLOAT(item->style->opacity.value) : 1); opacity *= 100; // Display in percent. _filter_modifier.set_opacity_value(opacity); // Set the blend mode - _filter_modifier.set_blend_mode(item->style->mix_blend_mode.set ? item->style->mix_blend_mode.value - : SP_CSS_BLEND_NORMAL); + _filter_modifier.set_blend_mode(item->style->mix_blend_mode.value, true); SPGaussianBlur *spblur = nullptr; if (item->style->getFilter()) { for (auto& primitive_obj: item->style->getFilter()->children) { @@ -613,6 +616,7 @@ void ObjectsPanel::_setCompositingValues(SPItem *item) _filter_modifier.set_blur_value(blur_value); //Unblock connections + _isolationConnection.unblock(); _blurConnection.unblock(); _blendConnection.unblock(); _opacityConnection.unblock(); @@ -1185,6 +1189,7 @@ void ObjectsPanel::_blockAllSignals(bool should_block = true) { // incoming signals _documentChangedCurrentLayer.block(should_block); + _isolationConnection.block(should_block); _opacityConnection.block(should_block); _blendConnection.block(should_block); _blurConnection.block(should_block); @@ -1600,14 +1605,38 @@ void ObjectsPanel::_opacityChangedIter(const Gtk::TreeIter& iter) } /** + * Callback for when the isolation value is changed + */ +void ObjectsPanel::_isolationValueChanged() +{ + _blockCompositeUpdate = true; + _tree.get_selection()->selected_foreach_iter(sigc::mem_fun(*this, &ObjectsPanel::_isolationChangedIter)); + DocumentUndo::maybeDone(_document, "isolation", SP_VERB_DIALOG_OBJECTS, _("Set object isolation")); + _blockCompositeUpdate = false; +} + +/** + * Change the isolation of the selected items in the tree + * @param iter Current tree item + */ +void ObjectsPanel::_isolationChangedIter(const Gtk::TreeIter &iter) +{ + Gtk::TreeModel::Row row = *iter; + SPItem *item = row[_model->_colObject]; + if (item) { + 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); + } +} + +/** * Callback for when the blend mode is changed */ void ObjectsPanel::_blendValueChanged() { _blockCompositeUpdate = true; - const Glib::ustring blendmode = _filter_modifier.get_blend_mode(); - - _tree.get_selection()->selected_foreach_iter(sigc::bind<Glib::ustring>(sigc::mem_fun(*this, &ObjectsPanel::_blendChangedIter), blendmode)); + _tree.get_selection()->selected_foreach_iter(sigc::mem_fun(*this, &ObjectsPanel::_blendChangedIter)); DocumentUndo::done(_document, SP_VERB_DIALOG_OBJECTS, _("Set object blend mode")); _blockCompositeUpdate = false; } @@ -1617,23 +1646,15 @@ void ObjectsPanel::_blendValueChanged() * @param iter Current tree item * @param blendmode Blend mode to set */ -void ObjectsPanel::_blendChangedIter(const Gtk::TreeIter& iter, Glib::ustring blendmode) +void ObjectsPanel::_blendChangedIter(const Gtk::TreeIter &iter) { Gtk::TreeModel::Row row = *iter; SPItem* item = row[_model->_colObject]; if (item) { - //Since blur and blend are both filters, we need to set both at the same time - SPStyle *style = item->style; - g_assert(style != nullptr); - SPCSSAttr *css = sp_css_attr_from_style(style, SP_STYLE_FLAG_ALWAYS | SP_STYLE_FLAG_IFSRC); - 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()); - } - sp_repr_css_change(item->getRepr(), css, "style"); - 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); } } @@ -1717,7 +1738,8 @@ ObjectsPanel::ObjectsPanel() : _clipmaskHeader(C_("Clip and mask", "CM")), _highlightHeader(C_("Highlight", "HL")), _nameHeader(_("Label")), - _filter_modifier( UI::Widget::SimpleFilterModifier::BLEND | + _filter_modifier( UI::Widget::SimpleFilterModifier::ISOLATION | + UI::Widget::SimpleFilterModifier::BLEND | UI::Widget::SimpleFilterModifier::BLUR | UI::Widget::SimpleFilterModifier::OPACITY ), _colorSelectorDialog("dialogs.colorpickerwindow") @@ -1859,7 +1881,8 @@ ObjectsPanel::ObjectsPanel() : _blendConnection = _filter_modifier.signal_blend_changed().connect(sigc::mem_fun(*this, &ObjectsPanel::_blendValueChanged)); _blurConnection = _filter_modifier.signal_blur_changed().connect(sigc::mem_fun(*this, &ObjectsPanel::_blurValueChanged)); _opacityConnection = _filter_modifier.signal_opacity_changed().connect( sigc::mem_fun(*this, &ObjectsPanel::_opacityValueChanged)); - + _isolationConnection = _filter_modifier.signal_isolation_changed().connect( + sigc::mem_fun(*this, &ObjectsPanel::_isolationValueChanged)); //Pack the compositing functions and the button row _page.pack_end(_filter_modifier, Gtk::PACK_SHRINK); _page.pack_end(_buttonsRow, Gtk::PACK_SHRINK); diff --git a/src/ui/dialog/objects.h b/src/ui/dialog/objects.h index 3800b2da5..155303374 100644 --- a/src/ui/dialog/objects.h +++ b/src/ui/dialog/objects.h @@ -85,6 +85,7 @@ private: sigc::connection _selectedConnection; //Connections for when the opacity/blend/blur of the active selection in the document changes + sigc::connection _isolationConnection; sigc::connection _opacityConnection; sigc::connection _blendConnection; sigc::connection _blurConnection; @@ -217,11 +218,14 @@ private: void _objectsChangedWrapper(SPObject *obj); void _objectsChanged(SPObject *obj); void _addObject( SPObject* obj, Gtk::TreeModel::Row* parentRow ); - + + void _isolationChangedIter(const Gtk::TreeIter &iter); + void _isolationValueChanged(); + void _opacityChangedIter(const Gtk::TreeIter& iter); void _opacityValueChanged(); - - void _blendChangedIter(const Gtk::TreeIter& iter, Glib::ustring blendmode); + + void _blendChangedIter(const Gtk::TreeIter &iter); void _blendValueChanged(); void _blurChangedIter(const Gtk::TreeIter& iter, double blur); diff --git a/src/ui/tools/node-tool.cpp b/src/ui/tools/node-tool.cpp index 931e08d15..f994f85cf 100644 --- a/src/ui/tools/node-tool.cpp +++ b/src/ui/tools/node-tool.cpp @@ -31,6 +31,8 @@ #include "live_effects/effect.h" #include "live_effects/lpeobject.h" +#include "include/macros.h" + #include "object/sp-clippath.h" #include "object/sp-item-group.h" #include "object/sp-mask.h" @@ -498,7 +500,8 @@ bool NodeTool::root_handler(GdkEvent* event) { case GDK_MOTION_NOTIFY: { sp_update_helperpath(); SPItem *over_item = nullptr; - if (!desktop->canvas->_scrooling) { + if (!desktop->canvas->_scrooling || MOD__CTRL(event) || MOD__SHIFT(event) || MOD__ALT(event)) { + desktop->canvas->_scrooling = false; combine_motion_events(desktop->canvas, event->motion, 0); over_item = sp_event_context_find_item(desktop, event_point(event->button), FALSE, TRUE); } diff --git a/src/ui/tools/select-tool.cpp b/src/ui/tools/select-tool.cpp index 9bd97fabc..6d5fdd2b9 100644 --- a/src/ui/tools/select-tool.cpp +++ b/src/ui/tools/select-tool.cpp @@ -554,7 +554,6 @@ bool SelectTool::root_handler(GdkEvent* event) { if ((event->motion.state & GDK_BUTTON1_MASK) && !this->space_panning) { Geom::Point const motion_pt(event->motion.x, event->motion.y); Geom::Point const p(desktop->w2d(motion_pt)); - if ( within_tolerance && ( abs( (gint) event->motion.x - xp ) < tolerance ) && ( abs( (gint) event->motion.y - yp ) < tolerance ) ) { 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(); }; } |
