summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorAdrian Boguszewski <adrbogus1@student.pg.gda.pl>2016-07-01 18:57:32 +0000
committerAdrian Boguszewski <adrbogus1@student.pg.gda.pl>2016-07-01 18:57:32 +0000
commit22262f2db6747eb516283b92abcfd348c700911a (patch)
tree010d0f5c42e6f6240a8f8ff7acb67bd3bb26ccc1 /src
parentAdded more tests (diff)
downloadinkscape-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.cpp9
-rw-r--r--src/object-set.h45
-rw-r--r--src/selection-chemistry.cpp20
-rw-r--r--src/splivarot.cpp2
-rw-r--r--src/ui/dialog/export.cpp9
-rw-r--r--src/ui/dialog/filter-effects-dialog.cpp2
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;