diff options
| author | Maximilian Albert <maximilian.albert@gmail.com> | 2007-12-13 20:08:06 +0000 |
|---|---|---|
| committer | cilix42 <cilix42@users.sourceforge.net> | 2007-12-13 20:08:06 +0000 |
| commit | 49308ff2f6ca0d4c640bc584b1b87a3ee6e31e97 (patch) | |
| tree | b02d64329cded4890fb01b7f9dd33a49f274eec7 /src/persp3d.cpp | |
| parent | Improved tango icons by Michael Grossberg. (diff) | |
| download | inkscape-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.cpp | 34 |
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); |
