diff options
| author | Tavmjong Bah <tavmjong@free.fr> | 2018-01-30 08:33:01 +0000 |
|---|---|---|
| committer | Tavmjong Bah <tavmjong@free.fr> | 2018-01-30 08:33:01 +0000 |
| commit | 267299811df952d08324a39008f52c19641de9e0 (patch) | |
| tree | 28fef736a52cb7a72119d119be8eb663ad20a77f /src/object-set.h | |
| parent | Translations: update inkscape.pot (diff) | |
| download | inkscape-267299811df952d08324a39008f52c19641de9e0.tar.gz inkscape-267299811df952d08324a39008f52c19641de9e0.zip | |
Move classes derived from SPObject to own directory.
A lot of header clean-up.
Diffstat (limited to 'src/object-set.h')
| -rw-r--r-- | src/object-set.h | 500 |
1 files changed, 0 insertions, 500 deletions
diff --git a/src/object-set.h b/src/object-set.h deleted file mode 100644 index f9f02a213..000000000 --- a/src/object-set.h +++ /dev/null @@ -1,500 +0,0 @@ -/* - * Multiindex container for selection - * - * Authors: - * Adrian Boguszewski - * Marc Jeanmougin - * - * Copyright (C) 2016 Adrian Boguszewski - * - * Released under GNU GPL, read the file 'COPYING' for more information - */ - -#ifndef INKSCAPE_PROTOTYPE_OBJECTSET_H -#define INKSCAPE_PROTOTYPE_OBJECTSET_H - -#include <string> -#include <unordered_map> -#include <boost/multi_index_container.hpp> -#include <boost/multi_index/identity.hpp> -#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> -#include <boost/utility/enable_if.hpp> -#include <sigc++/connection.h> -#include <inkgc/gc-soft-ptr.h> -#include "sp-object.h" -#include "sp-item.h" -#include "sp-item-group.h" -#include "desktop.h" -#include "document.h" -#include "verbs.h" - -enum BoolOpErrors { - DONE, - DONE_NO_PATH, - DONE_NO_ACTION, - ERR_TOO_LESS_PATHS_1, - ERR_TOO_LESS_PATHS_2, - ERR_NO_PATHS, - ERR_Z_ORDER -}; - -// boolean operation -enum bool_op -{ - bool_op_union, // A OR B - bool_op_inters, // A AND B - bool_op_diff, // A \ B - bool_op_symdiff, // A XOR B - bool_op_cut, // coupure (pleines) - bool_op_slice // coupure (contour) -}; -typedef enum bool_op BooleanOp; - -class SPBox3D; -class Persp3D; - -namespace Inkscape { - -namespace XML { -class Node; -} - -struct hashed{}; -struct random_access{}; - -struct is_item { - bool operator()(SPObject* obj) { - return SP_IS_ITEM(obj); - } -}; - -struct is_group { - bool operator()(SPObject* obj) { - return SP_IS_GROUP(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(); - } -}; - -struct object_to_group { - typedef SPGroup* result_type; - SPGroup* operator()(SPObject* obj) const { - return SP_GROUP(obj); - } -}; - -typedef boost::multi_index_container< - SPObject*, - boost::multi_index::indexed_by< - boost::multi_index::sequenced<>, - boost::multi_index::random_access< - boost::multi_index::tag<random_access>>, - boost::multi_index::hashed_unique< - boost::multi_index::tag<hashed>, - boost::multi_index::identity<SPObject*>> - >> MultiIndexContainer; - -typedef boost::any_range< - SPObject*, - boost::random_access_traversal_tag, - SPObject* const&, - std::ptrdiff_t> SPObjectRange; - -class ObjectSet { -public: - enum CompareSize {HORIZONTAL, VERTICAL, AREA}; - typedef decltype(MultiIndexContainer().get<random_access>() | boost::adaptors::filtered(is_item()) | boost::adaptors::transformed(object_to_item())) SPItemRange; - typedef decltype(MultiIndexContainer().get<random_access>() | boost::adaptors::filtered(is_group()) | boost::adaptors::transformed(object_to_group())) SPGroupRange; - typedef decltype(MultiIndexContainer().get<random_access>() | boost::adaptors::filtered(is_item()) | boost::adaptors::transformed(object_to_node())) XMLNodeRange; - - ObjectSet(SPDesktop* desktop): _desktop(desktop) { - if (desktop) - _document = desktop->getDocument(); - }; - ObjectSet(SPDocument* doc): _desktop(nullptr), _document(doc) {}; - ObjectSet(): _desktop(nullptr), _document(nullptr) {}; - virtual ~ObjectSet(); - - void setDocument(SPDocument* doc){ - _document = doc; - } - - - /** - * Add an SPObject to the set of selected objects. - * - * @param obj the SPObject to add - * @param nosignal true if no signals should be sent - */ - bool add(SPObject* object, bool nosignal = false); - - /** - * Add an XML node's SPObject to the set of selected objects. - * - * @param the xml node of the item to add - */ - void add(XML::Node *repr) { - if(document() && repr) - add(document()->getObjectById(repr->attribute("id"))); - } - - /** Add items from an STL iterator range to the selection. - * \param from the begin iterator - * \param to the end iterator - */ - template <typename InputIterator> - void add(InputIterator from, InputIterator to) { - for(auto it = from; it != to; ++it) { - _add(*it); - } - _emitSignals(); - } - - /** - * Removes an item from the set of selected objects. - * - * It is ok to call this method for an unselected item. - * - * @param item the item to unselect - * - * @return is success - */ - bool remove(SPObject* object); - - /** - * Returns true if the given object is selected. - */ - bool includes(SPObject *object); - - /** - * Set the selection to a single specific object. - * - * @param obj the object to select - */ - void set(SPObject *object, bool persist_selection_context = false); - void set(XML::Node *repr) { - if(document() && repr) - set(document()->getObjectById(repr->attribute("id"))); - } - /** - * Unselects all selected objects. - */ - void clear(); - - /** - * Returns size of the selection. - */ - int size(); - - /** - * Returns true if no items are selected. - */ - bool isEmpty(); - - /** - * Removes an item if selected, adds otherwise. - * - * @param item the item to unselect - */ - void toggle(SPObject *obj); - - /** - * Returns a single selected object. - * - * @return NULL unless exactly one object is selected - */ - SPObject *single(); - - /** - * Returns a single selected item. - * - * @return NULL unless exactly one object is selected - */ - SPItem *singleItem(); - - /** - * Returns the smallest item from this selection. - */ - SPItem *smallestItem(CompareSize compare); - - /** - * Returns the largest item from this selection. - */ - SPItem *largestItem(CompareSize compare); - - /** Returns the list of selected objects. */ - SPObjectRange objects(); - - /** Returns a range of selected SPItems. */ - SPItemRange items() { - return SPItemRange(_container.get<random_access>() - | boost::adaptors::filtered(is_item()) - | boost::adaptors::transformed(object_to_item())); - }; - - /** Returns a range of selected groups. */ - SPGroupRange groups() { - return SPGroupRange (_container.get<random_access>() - | boost::adaptors::filtered(is_group()) - | boost::adaptors::transformed(object_to_group())); - } - - /** Returns a range of the xml nodes of all selected objects. */ - 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. - * - * @return NULL unless exactly one object is selected - */ - XML::Node *singleRepr(); - - /** - * Selects exactly the specified objects. - * - * @param objs the objects to select - */ - template <class T> - typename boost::enable_if<boost::is_base_of<SPObject, T>, void>::type - setList(const std::vector<T*> &objs) { - _clear(); - addList(objs); - } - - /** - * Selects exactly the specified objects. - * - * @param list the repr list to add - */ - void setReprList(std::vector<XML::Node*> const &list); - - /** - * Adds the specified objects to selection, without deselecting first. - * - * @param objs the objects to select - */ - template <class T> - typename boost::enable_if<boost::is_base_of<SPObject, T>, void>::type - addList(const std::vector<T*> &objs) { - for (auto obj: objs) { - if (!includes(obj)) { - add(obj, true); - } - } - _emitSignals(); - } - - /** Returns the bounding rectangle of the selection. */ - Geom::OptRect bounds(SPItem::BBoxType type) const; - Geom::OptRect visualBounds() const; - Geom::OptRect geometricBounds() const; - - /** - * Returns either the visual or geometric bounding rectangle of the selection, based on the - * preferences specified for the selector tool - */ - Geom::OptRect preferredBounds() const; - - /* Returns the bounding rectangle of the selectionin document coordinates.*/ - Geom::OptRect documentBounds(SPItem::BBoxType type) const; - - /** - * Returns the rotation/skew center of the selection. - */ - boost::optional<Geom::Point> center() const; - - /** Returns a list of all perspectives which have a 3D box in the current selection. - (these may also be nested in groups) */ - std::list<Persp3D *> const perspList(); - - /** - * Returns a list of all 3D boxes in the current selection which are associated to @c - * persp. If @c pers is @c NULL, return all selected boxes. - */ - std::list<SPBox3D *> const box3DList(Persp3D *persp = NULL); - - /** - * Returns the desktop the selection is bound to - * - * @return the desktop the selection is bound to, or NULL if in console mode - */ - SPDesktop *desktop() { return _desktop; } - - /** - * Returns the document the selection is bound to - * - * @return the document the selection is bound to, or NULL if in console mode - */ - SPDocument *document() { return _document; } - - //item groups operations - //in selection-chemistry.cpp - void deleteItems(); - void duplicate(bool suppressDone = false, bool duplicateLayer = false); - void clone(); - - /** - * @brief Unlink all directly selected clones. - * @param skip_undo If this is set to true the call to DocumentUndo::done is omitted. - * @return True if anything was unlinked, otherwise false. - */ - bool unlink(const bool skip_undo = false); - /** - * @brief Recursively unlink any clones present in the current selection, - * including clones which are used to clip other objects, groups of clones etc. - * @return true if anything was unlinked, otherwise false. - */ - bool unlinkRecursive(const bool skip_undo = false); - void relink(); - void cloneOriginal(); - void cloneOriginalPathLPE(bool allow_transforms = false); - Inkscape::XML::Node* group(); - void popFromGroup(); - void ungroup(); - - //z-order management - //in selection-chemistry.cpp - void stackUp(bool skip_undo = false); - void raise(bool skip_undo = false); - void raiseToTop(bool skip_undo = false); - void stackDown(bool skip_undo = false); - void lower(bool skip_undo = false); - void lowerToBottom(bool skip_undo = false); - void toNextLayer(bool skip_undo = false); - void toPrevLayer(bool skip_undo = false); - void toLayer(SPObject *layer, bool skip_undo = false); - - //clipboard management - //in selection-chemistry.cpp - void copy(); - void cut(); - void pasteStyle(); - void pasteSize(bool apply_x, bool apply_y); - void pasteSizeSeparately(bool apply_x, bool apply_y); - void pastePathEffect(); - - //path operations - //in path-chemistry.cpp - void combine(bool skip_undo = false); - void breakApart(bool skip_undo = false); - void toCurves(bool skip_undo = false); - void toLPEItems(); - void pathReverse(); - - // Boolean operations - // in splivarot.cpp - bool pathUnion(const bool skip_undo = false); - bool pathIntersect(const bool skip_undo = false); - bool pathDiff(const bool skip_undo = false); - bool pathSymDiff(const bool skip_undo = false); - bool pathCut(const bool skip_undo = false); - bool pathSlice(const bool skip_undo = false); - - //Other path operations - //in selection-chemistry.cpp - void toMarker(bool apply = true); - void toGuides(); - void toSymbol(); - void unSymbol(); - void tile(bool apply = true); //"Object to Pattern" - void untile(); - void createBitmapCopy(); - void setMask(bool apply_clip_path, bool apply_to_layer = false, bool skip_undo = false); - void editMask(bool clip); - void unsetMask(const bool apply_clip_path, const bool skip_undo = false); - void setClipGroup(); - - // moves - // in selection-chemistry.cpp - void removeLPE(); - void removeFilter(); - void applyAffine(Geom::Affine const &affine, bool set_i2d=true,bool compensate=true, bool adjust_transf_center=true); - void removeTransform(); - void setScaleAbsolute(double, double, double, double); - void setScaleRelative(const Geom::Point&, const Geom::Scale&); - void rotateRelative(const Geom::Point&, double); - void skewRelative(const Geom::Point&, double, double); - void moveRelative(const Geom::Point &move, bool compensate = true); - void moveRelative(double dx, double dy); - void rotate90(bool ccw); - void rotate(double); - void rotateScreen(double); - void scale(double); - void scaleScreen(double); - void scaleTimes(double); - void move(double dx, double dy); - void moveScreen(double dx, double dy); - - // various - void getExportHints(Glib::ustring &filename, float *xdpi, float *ydpi); - bool fitCanvas(bool with_margins, bool skip_undo = false); - void swapFillStroke(); - -protected: - virtual void _connectSignals(SPObject* object) {}; - virtual void _releaseSignals(SPObject* object) {}; - virtual void _emitSignals() {}; - void _add(SPObject* object); - void _clear(); - void _remove(SPObject* object); - bool _anyAncestorIsInSet(SPObject *object); - void _removeDescendantsFromSet(SPObject *object); - void _removeAncestorsFromSet(SPObject *object); - SPItem *_sizeistItem(bool sml, CompareSize compare); - SPObject *_getMutualAncestor(SPObject *object); - virtual void _add3DBoxesRecursively(SPObject *obj); - virtual void _remove3DBoxesRecursively(SPObject *obj); - - MultiIndexContainer _container; - GC::soft_ptr<SPDesktop> _desktop; - GC::soft_ptr<SPDocument> _document; - std::list<SPBox3D *> _3dboxes; - std::unordered_map<SPObject*, sigc::connection> _releaseConnections; - -private: - BoolOpErrors pathBoolOp(bool_op bop, const bool skip_undo, const bool checked = false, const unsigned int verb = SP_VERB_NONE, const Glib::ustring description = ""); - void _disconnect(SPObject* object); - -}; - -typedef ObjectSet::SPItemRange SPItemRange; -typedef ObjectSet::SPGroupRange SPGroupRange; -typedef ObjectSet::XMLNodeRange XMLNodeRange; - -} // namespace Inkscape - -#endif //INKSCAPE_PROTOTYPE_OBJECTSET_H - -/* - Local Variables: - mode:c++ - c-file-style:"stroustrup" - c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +)) - indent-tabs-mode:nil - fill-column:99 - End: -*/ -// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 : |
