diff --git a/src/selection.h b/src/selection.h
index 6996e3ec8684f36e6b4ab7426cda65004e933859..3d45c171d95021093c98eba4aef4c098a1f61777 100644 (file)
--- a/src/selection.h
+++ b/src/selection.h
*/
#include <vector>
+#include <map>
+#include <list>
#include <sigc++/sigc++.h>
#include "libnr/nr-rect.h"
#include "gc-anchored.h"
#include "gc-soft-ptr.h"
#include "util/list.h"
+#include "sp-item.h"
class SPItem;
+class SPBox3D;
+class Persp3D;
namespace Inkscape {
namespace XML {
~Selection();
/**
- * @brief Returns the desktop the seoection is bound to
+ * @brief Returns the desktop the selection is bound to
*
* @return the desktop the selection is bound to
*/
SPDesktop *desktop() { return _desktop; }
+ /**
+ * @brief Returns active layer for selection (currentLayer or its parent)
+ *
+ * @return layer item the selection is bound to
+ */
+ SPObject *activeContext();
+
/**
* @brief Add an SPObject to the set of selected objects
*
* @param obj the SPObject to add
*/
- void add(SPObject *obj);
+ void add(SPObject *obj, bool persist_selection_context = false);
/**
* @brief Add an XML node's SPObject to the set of selected objects
*
* @param obj the object to select
*/
- void set(SPObject *obj);
+ void set(SPObject *obj, bool persist_selection_context = false);
/**
* @brief Set the selection to an XML node's SPObject
/// method for that
GSList const *reprList();
+ /* 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();
+
+ std::list<SPBox3D *> const box3DList();
+
/** @brief Returns the number of layers in which there are selected objects */
guint numberOfLayers();
guint numberOfParents();
/** @brief Returns the bounding rectangle of the selection */
- NRRect *bounds(NRRect *dest) const;
+ NRRect *bounds(NRRect *dest, SPItem::BBoxType type = SPItem::APPROXIMATE_BBOX) const;
/** @brief Returns the bounding rectangle of the selection */
- ::NR::Rect bounds() const;
+ NR::Maybe<NR::Rect> bounds(SPItem::BBoxType type = SPItem::APPROXIMATE_BBOX) const;
/**
* @brief Returns the bounding rectangle of the selection
*
* \todo how is this different from bounds()?
*/
- NRRect *boundsInDocument(NRRect *dest) const;
+ NRRect *boundsInDocument(NRRect *dest, SPItem::BBoxType type = SPItem::APPROXIMATE_BBOX) const;
/**
* @brief Returns the bounding rectangle of the selection
*
* \todo how is this different from bounds()?
*/
- ::NR::Rect boundsInDocument() const;
+ NR::Maybe<NR::Rect> boundsInDocument(SPItem::BBoxType type = SPItem::APPROXIMATE_BBOX) const;
+
+ /**
+ * @brief Returns the rotation/skew center of the selection
+ */
+ NR::Maybe<NR::Point> center() const;
/**
* @brief Gets the selection's snap points.
* @return Selection's snap points
*/
- std::vector<NR::Point> getSnapPoints() const;
+ std::vector<NR::Point> getSnapPoints(bool includeItemCenter) const;
/**
* @brief Gets the snap points of a selection that form a convex hull.
*/
std::vector<NR::Point> getSnapPointsConvexHull() const;
- /**
- * @return A vector containing the top-left and bottom-right
- * corners of each selected object's bounding box.
- */
- std::vector<NR::Point> getBBoxPoints() const;
-
/**
* @brief Connects a slot to be notified of selection changes
*
/** @brief Issues modification notification signals */
static gboolean _emit_modified(Selection *selection);
/** @brief Schedules an item modification signal to be sent */
- static void _schedule_modified(SPObject *obj, guint flags, Selection *selection);
- /** @brief Releases a selected object that is being removed */
- static void _release(SPObject *obj, Selection *selection);
+ void _schedule_modified(SPObject *obj, guint flags);
/** @brief Issues modified selection signal */
void _emitModified(guint flags);
/** @brief Issues changed selection signal */
- void _emitChanged();
+ void _emitChanged(bool persist_selection_context = false);
void _invalidateCachedLists();
void _remove(SPObject *obj);
/** @brief returns the SPObject corresponding to an xml node (if any) */
SPObject *_objectForXMLNode(XML::Node *repr) const;
+ /** @brief Releases an active layer object that is being removed */
+ void _releaseContext(SPObject *obj);
mutable GSList *_objs;
mutable GSList *_reprs;
mutable GSList *_items;
+ void add_box_perspective(SPBox3D *box);
+ void add_3D_boxes_recursively(SPObject *obj);
+ void remove_box_perspective(SPBox3D *box);
+ void remove_3D_boxes_recursively(SPObject *obj);
+
+ std::map<Persp3D *, unsigned int> _persps;
+ std::list<SPBox3D *> _3dboxes;
+
GC::soft_ptr<SPDesktop> _desktop;
+ SPObject* _selection_context;
guint _flags;
guint _idle;
+ std::map<SPObject *, sigc::connection> _modified_connections;
+ std::map<SPObject *, sigc::connection> _release_connections;
+ sigc::connection _context_release_connection;
+
sigc::signal<void, Selection *> _changed_signal;
sigc::signal<void, Selection *, guint> _modified_signal;
};