diff options
| author | Adrian Boguszewski <adrbogus1@student.pg.gda.pl> | 2016-07-01 18:57:32 +0000 |
|---|---|---|
| committer | Adrian Boguszewski <adrbogus1@student.pg.gda.pl> | 2016-07-01 18:57:32 +0000 |
| commit | 22262f2db6747eb516283b92abcfd348c700911a (patch) | |
| tree | 010d0f5c42e6f6240a8f8ff7acb67bd3bb26ccc1 /src | |
| parent | Added more tests (diff) | |
| download | inkscape-22262f2db6747eb516283b92abcfd348c700911a.tar.gz inkscape-22262f2db6747eb516283b92abcfd348c700911a.zip | |
Added xmlNodes as range function
(bzr r14954.1.12)
Diffstat (limited to 'src')
| -rw-r--r-- | src/object-set.cpp | 9 | ||||
| -rw-r--r-- | src/object-set.h | 45 | ||||
| -rw-r--r-- | src/selection-chemistry.cpp | 20 | ||||
| -rw-r--r-- | src/splivarot.cpp | 2 | ||||
| -rw-r--r-- | src/ui/dialog/export.cpp | 9 | ||||
| -rw-r--r-- | src/ui/dialog/filter-effects-dialog.cpp | 2 |
6 files changed, 50 insertions, 37 deletions
diff --git a/src/object-set.cpp b/src/object-set.cpp index 518ce15a3..1240e5198 100644 --- a/src/object-set.cpp +++ b/src/object-set.cpp @@ -15,6 +15,8 @@ #include "box3d.h" #include "persp3d.h" #include "preferences.h" +#include <boost/range/adaptor/filtered.hpp> +#include <boost/range/adaptor/transformed.hpp> namespace Inkscape { @@ -233,13 +235,6 @@ std::vector<SPItem*> ObjectSet::items() { return result; } -std::vector<XML::Node*> ObjectSet::xmlNodes() { - std::vector<SPItem*> list = items(); - std::vector<XML::Node*> result; - std::transform(list.begin(), list.end(), std::back_inserter(result), [](SPItem* item) { return item->getRepr(); }); - return result; -} - Inkscape::XML::Node *ObjectSet::singleRepr() { SPObject *obj = single(); return obj ? obj->getRepr() : nullptr; diff --git a/src/object-set.h b/src/object-set.h index 29083863b..ea6534350 100644 --- a/src/object-set.h +++ b/src/object-set.h @@ -19,6 +19,8 @@ #include <boost/multi_index/sequenced_index.hpp> #include <boost/multi_index/hashed_index.hpp> #include <boost/multi_index/random_access_index.hpp> +#include <boost/range/adaptor/filtered.hpp> +#include <boost/range/adaptor/transformed.hpp> #include <boost/range/sub_range.hpp> #include <boost/range/any_range.hpp> #include <boost/type_traits.hpp> @@ -39,6 +41,26 @@ class Node; struct hashed{}; struct random_access{}; +struct is_item { + bool operator()(SPObject* obj) { + return SP_IS_ITEM(obj); + } +}; + +struct object_to_item { + typedef SPItem* result_type; + SPItem* operator()(SPObject* obj) const { + return SP_ITEM(obj); + } +}; + +struct object_to_node { + typedef XML::Node* result_type; + XML::Node* operator()(SPObject* obj) const { + return obj->getRepr(); + } +}; + typedef boost::multi_index_container< SPObject*, boost::multi_index::indexed_by< @@ -56,21 +78,11 @@ typedef boost::any_range< SPObject* const&, std::ptrdiff_t> SPObjectRange; -typedef boost::any_range< - SPItem*, - boost::random_access_traversal_tag, - SPItem* const&, - std::ptrdiff_t> SPItemRange; - -typedef boost::any_range< - XML::Node*, - boost::random_access_traversal_tag, - XML::Node* const&, - std::ptrdiff_t> XMLNodeRange; - class ObjectSet { public: enum CompareSize {HORIZONTAL, VERTICAL, AREA}; + typedef decltype(multi_index_container().get<random_access>() | boost::adaptors::filtered(is_item()) | boost::adaptors::transformed(object_to_item())) SPItemRange; + typedef decltype(multi_index_container().get<random_access>() | boost::adaptors::filtered(is_item()) | boost::adaptors::transformed(object_to_node())) XMLNodeRange; ObjectSet() {}; virtual ~ObjectSet(); @@ -169,7 +181,11 @@ public: std::vector<SPItem*> items(); /** Returns a list of the xml nodes of all selected objects. */ - std::vector<XML::Node*> xmlNodes(); + XMLNodeRange xmlNodes() { + return XMLNodeRange(container.get<random_access>() + | boost::adaptors::filtered(is_item()) + | boost::adaptors::transformed(object_to_node())); + } /** * Returns a single selected object's xml node. @@ -255,6 +271,9 @@ protected: }; +typedef ObjectSet::SPItemRange SPItemRange; +typedef ObjectSet::XMLNodeRange XMLNodeRange; + } // namespace Inkscape #endif //INKSCAPE_PROTOTYPE_OBJECTSET_H diff --git a/src/selection-chemistry.cpp b/src/selection-chemistry.cpp index ded776fea..82f89c03a 100644 --- a/src/selection-chemistry.cpp +++ b/src/selection-chemistry.cpp @@ -454,7 +454,7 @@ void sp_selection_duplicate(SPDesktop *desktop, bool suppressDone, bool duplicat desktop->messageStack()->flash(Inkscape::WARNING_MESSAGE, _("Select <b>object(s)</b> to duplicate.")); return; } - std::vector<Inkscape::XML::Node*> reprs(selection->xmlNodes()); + std::vector<Inkscape::XML::Node*> reprs(selection->xmlNodes().begin(), selection->xmlNodes().end()); if(duplicateLayer){ reprs.clear(); @@ -763,7 +763,7 @@ void sp_selection_group(Inkscape::Selection *selection, SPDesktop *desktop) return; } - std::vector<Inkscape::XML::Node*> p (selection->xmlNodes()); + std::vector<Inkscape::XML::Node*> p (selection->xmlNodes().begin(), selection->xmlNodes().end()); selection->clear(); @@ -1048,7 +1048,7 @@ void sp_selection_raise_to_top(Inkscape::Selection *selection, SPDesktop *deskto return; } - std::vector<Inkscape::XML::Node*> rl(selection->xmlNodes()); + std::vector<Inkscape::XML::Node*> rl(selection->xmlNodes().begin(), selection->xmlNodes().end()); sort(rl.begin(),rl.end(),sp_repr_compare_position_bool); for (std::vector<Inkscape::XML::Node*>::const_iterator l=rl.begin(); l!=rl.end();++l) { @@ -1132,7 +1132,7 @@ void sp_selection_lower_to_bottom(Inkscape::Selection *selection, SPDesktop *des return; } - std::vector<Inkscape::XML::Node*> rl(selection->xmlNodes()); + std::vector<Inkscape::XML::Node*> rl(selection->xmlNodes().begin(), selection->xmlNodes().end()); sort(rl.begin(),rl.end(),sp_repr_compare_position_bool); for (std::vector<Inkscape::XML::Node*>::const_reverse_iterator l=rl.rbegin();l!=rl.rend();++l) { @@ -1722,8 +1722,8 @@ void sp_selection_remove_transform(SPDesktop *desktop) Inkscape::Selection *selection = desktop->getSelection(); - std::vector<Inkscape::XML::Node*> items = selection->xmlNodes(); - for (std::vector<Inkscape::XML::Node*>::const_iterator l=items.begin();l!=items.end() ;++l) { + auto items = selection->xmlNodes(); + for (auto l=items.begin();l!=items.end() ;++l) { (*l)->setAttribute("transform", NULL, false); } @@ -2603,7 +2603,7 @@ void sp_selection_clone(SPDesktop *desktop) return; } - std::vector<Inkscape::XML::Node*> reprs (selection->xmlNodes()); + std::vector<Inkscape::XML::Node*> reprs(selection->xmlNodes().begin(), selection->xmlNodes().end()); selection->clear(); @@ -3472,12 +3472,12 @@ void sp_selection_get_export_hints(Inkscape::Selection *selection, Glib::ustring return; } - std::vector<Inkscape::XML::Node*> const reprlst = selection->xmlNodes(); + auto reprlst = selection->xmlNodes(); bool filename_search = TRUE; bool xdpi_search = TRUE; bool ydpi_search = TRUE; - for (std::vector<Inkscape::XML::Node*>::const_iterator i=reprlst.begin();filename_search&&xdpi_search&&ydpi_search&&i!=reprlst.end();++i){ + for (auto i=reprlst.begin();filename_search&&xdpi_search&&ydpi_search&&i!=reprlst.end();++i){ gchar const *dpi_string; Inkscape::XML::Node *repr = *i; @@ -3765,7 +3765,7 @@ void sp_selection_set_clipgroup(SPDesktop *desktop) return; } - std::vector<Inkscape::XML::Node*> p(selection->xmlNodes()); + std::vector<Inkscape::XML::Node*> p(selection->xmlNodes().begin(), selection->xmlNodes().end()); sort(p.begin(),p.end(),sp_repr_compare_position_bool); diff --git a/src/splivarot.cpp b/src/splivarot.cpp index d4ef3f9c2..09d74a010 100644 --- a/src/splivarot.cpp +++ b/src/splivarot.cpp @@ -689,7 +689,7 @@ sp_selected_path_boolop(Inkscape::Selection *selection, SPDesktop *desktop, bool } } else { // find out the bottom object - std::vector<Inkscape::XML::Node*> sorted(selection->xmlNodes()); + std::vector<Inkscape::XML::Node*> sorted(selection->xmlNodes().begin(), selection->xmlNodes().end()); sort(sorted.begin(),sorted.end(),sp_repr_compare_position_bool); diff --git a/src/ui/dialog/export.cpp b/src/ui/dialog/export.cpp index 6d2842511..dbee80af9 100644 --- a/src/ui/dialog/export.cpp +++ b/src/ui/dialog/export.cpp @@ -820,8 +820,8 @@ void Export::onAreaToggled () one that's nice */ if (filename.empty()) { const gchar * id = "object"; - const std::vector<XML::Node*> reprlst = SP_ACTIVE_DESKTOP->getSelection()->xmlNodes(); - for(std::vector<XML::Node*>::const_iterator i=reprlst.begin(); reprlst.end() != i; ++i) { + auto reprlst = SP_ACTIVE_DESKTOP->getSelection()->xmlNodes(); + for(auto i=reprlst.begin(); reprlst.end() != i; ++i) { Inkscape::XML::Node * repr = *i; if (repr->attribute("id")) { id = repr->attribute("id"); @@ -1231,15 +1231,14 @@ void Export::onExport () break; } case SELECTION_SELECTION: { - std::vector<XML::Node*> reprlst; SPDocument * doc = SP_ACTIVE_DOCUMENT; bool modified = false; bool saved = DocumentUndo::getUndoSensitive(doc); DocumentUndo::setUndoSensitive(doc, false); - reprlst = desktop->getSelection()->xmlNodes(); + auto reprlst = desktop->getSelection()->xmlNodes(); - for(std::vector<Inkscape::XML::Node*>::const_iterator i=reprlst.begin(); reprlst.end() != i; ++i) { + for(auto i=reprlst.begin(); reprlst.end() != i; ++i) { Inkscape::XML::Node * repr = *i; const gchar * temp_string; Glib::ustring dir = Glib::path_get_dirname(filename.c_str()); diff --git a/src/ui/dialog/filter-effects-dialog.cpp b/src/ui/dialog/filter-effects-dialog.cpp index dfc19f3cc..ccba5a278 100644 --- a/src/ui/dialog/filter-effects-dialog.cpp +++ b/src/ui/dialog/filter-effects-dialog.cpp @@ -691,7 +691,7 @@ private: void select_svg_element(){ Inkscape::Selection* sel = _desktop->getSelection(); if (sel->isEmpty()) return; - Inkscape::XML::Node* node = sel->xmlNodes()[0]; + Inkscape::XML::Node* node = sel->xmlNodes().front(); if (!node || !node->matchAttributeName("id")) return; std::ostringstream xlikhref; |
