summaryrefslogtreecommitdiffstats
path: root/src/persp3d.cpp
diff options
context:
space:
mode:
authorMaximilian Albert <maximilian.albert@gmail.com>2007-12-13 20:08:06 +0000
committercilix42 <cilix42@users.sourceforge.net>2007-12-13 20:08:06 +0000
commit49308ff2f6ca0d4c640bc584b1b87a3ee6e31e97 (patch)
treeb02d64329cded4890fb01b7f9dd33a49f274eec7 /src/persp3d.cpp
parentImproved tango icons by Michael Grossberg. (diff)
downloadinkscape-49308ff2f6ca0d4c640bc584b1b87a3ee6e31e97.tar.gz
inkscape-49308ff2f6ca0d4c640bc584b1b87a3ee6e31e97.zip
If necessary, split up perspectives when applying transformations to boxes; moreover, fix crash caused by listening to already destroyed perspectives
(bzr r4227)
Diffstat (limited to 'src/persp3d.cpp')
-rw-r--r--src/persp3d.cpp34
1 files changed, 32 insertions, 2 deletions
diff --git a/src/persp3d.cpp b/src/persp3d.cpp
index 3dafba30d..818afe053 100644
--- a/src/persp3d.cpp
+++ b/src/persp3d.cpp
@@ -129,6 +129,8 @@ static void persp3d_build(SPObject *object, SPDocument *document, Inkscape::XML:
static void persp3d_release(SPObject *object) {
//Persp3D *persp = (Persp3D *) object;
+ SP_OBJECT_REPR(object)->removeListenerByData(object);
+
// FIXME: What precisely does this do and is it necessary for perspectives?
/**
if (SP_OBJECT_DOCUMENT(object)) {
@@ -356,6 +358,7 @@ void
persp3d_apply_affine_transformation (Persp3D *persp, NR::Matrix const &xform) {
persp->tmat *= xform;
persp3d_update_box_reprs(persp);
+ SP_OBJECT(persp)->updateRepr(SP_OBJECT_WRITE_EXT);
}
gchar *
@@ -489,8 +492,8 @@ persp3d_on_repr_attr_changed ( Inkscape::XML::Node * repr,
/* returns a std::set() of all perspectives of the currently selected boxes */
std::set<Persp3D *>
-persp3d_currently_selected (Box3DContext *bc) {
- Inkscape::Selection *selection = sp_desktop_selection (bc->desktop);
+persp3d_currently_selected_persps (SPEventContext *ec) {
+ Inkscape::Selection *selection = sp_desktop_selection (ec->desktop);
std::set<Persp3D *> p;
for (GSList *i = (GSList *) selection->itemList(); i != NULL; i = i->next) {
@@ -501,6 +504,33 @@ persp3d_currently_selected (Box3DContext *bc) {
return p;
}
+/* checks whether all boxes linked to this perspective are currently selected */
+bool
+persp3d_has_all_boxes_in_selection (Persp3D *persp) {
+ const GSList *selection = sp_desktop_selection (inkscape_active_desktop())->itemList();
+
+ for (std::vector<SPBox3D *>::iterator i = persp->boxes.begin(); i != persp->boxes.end(); ++i) {
+ if (g_slist_find((GSList *) selection, *i) == NULL) {
+ // we have an unselected box in the perspective
+ return false;
+ }
+ }
+ return true;
+}
+
+std::list<SPBox3D *>
+persp3d_selected_boxes (Persp3D *persp) {
+ const GSList *selection = sp_desktop_selection (inkscape_active_desktop())->itemList();
+ std::list<SPBox3D *> sel;
+
+ for (std::vector<SPBox3D *>::iterator i = persp->boxes.begin(); i != persp->boxes.end(); ++i) {
+ if (g_slist_find((GSList *) selection, *i) != NULL) {
+ sel.push_back(SP_BOX3D(*i));
+ }
+ }
+ return sel;
+}
+
void
persp3d_print_debugging_info (Persp3D *persp) {
g_print ("=== Info for Persp3D %d ===\n", persp->my_counter);