Code

Warning cleanup.
[inkscape.git] / src / selection-chemistry.cpp
index a9736e9910823e048e5345a23055709c9003fdf7..dfe47bee842f9b1b08aa2534c919099172723813 100644 (file)
@@ -76,6 +76,7 @@
 #include "helper/units.h"
 #include "sp-item.h"
 #include "box3d.h"
+#include "persp3d.h"
 #include "unit-constants.h"
 #include "xml/simple-document.h"
 #include "sp-filter-reference.h"
@@ -1169,7 +1170,6 @@ selection_contains_both_clone_and_original(Inkscape::Selection *selection)
     return clone_with_original;
 }
 
-
 /** Apply matrix to the selection.  \a set_i2d is normally true, which means objects are in the
 original transform, synced with their reprs, and need to jump to the new transform in one go. A
 value of set_i2d==false is only used by seltrans when it's dragging objects live (not outlines); in
@@ -1181,6 +1181,29 @@ void sp_selection_apply_affine(Inkscape::Selection *selection, Geom::Matrix cons
     if (selection->isEmpty())
         return;
 
+    // For each perspective with a box in selection, check whether all boxes are selected and
+    // unlink all non-selected boxes.
+    Persp3D *persp;
+    Persp3D *transf_persp;
+    std::list<Persp3D *> plist = selection->perspList();
+    for (std::list<Persp3D *>::iterator i = plist.begin(); i != plist.end(); ++i) {
+        persp = (Persp3D *) (*i);
+
+        if (!persp3d_has_all_boxes_in_selection (persp, selection)) {
+            std::list<SPBox3D *> selboxes = selection->box3DList(persp);
+
+            // create a new perspective as a copy of the current one and link the selected boxes to it
+            transf_persp = persp3d_create_xml_element (SP_OBJECT_DOCUMENT(persp), persp->perspective_impl);
+
+            for (std::list<SPBox3D *>::iterator b = selboxes.begin(); b != selboxes.end(); ++b)
+                box3d_switch_perspectives(*b, persp, transf_persp);
+        } else {
+            transf_persp = persp;
+        }
+
+        persp3d_apply_affine_transformation(transf_persp, affine);
+    }
+
     for (GSList const *l = selection->itemList(); l != NULL; l = l->next) {
         SPItem *item = SP_ITEM(l->data);
 
@@ -1728,7 +1751,7 @@ void sp_selection_next_patheffect_param(SPDesktop * dt)
     return false;
 }*/
 
-void sp_selection_edit_clip_or_mask(SPDesktop * dt, bool clip)
+void sp_selection_edit_clip_or_mask(SPDesktop * /*dt*/, bool /*clip*/)
 {
     return;
     /*if (!dt) return;
@@ -2906,10 +2929,12 @@ void sp_selection_unset_mask(SPDesktop *desktop, bool apply_clip_path) {
 }
 
 /**
- * Returns true if an undoable change should be recorded.
+ * \param with_margins margins defined in the xml under <sodipodi:namedview>
+ *                     "fit-margin-..." attributes.  See SPDocument::fitToRect.
+ * \return true if an undoable change should be recorded.
  */
 bool
-fit_canvas_to_selection(SPDesktop *desktop)
+fit_canvas_to_selection(SPDesktop *desktop, bool with_margins)
 {
     g_return_val_if_fail(desktop != NULL, false);
     SPDocument *doc = sp_desktop_document(desktop);
@@ -2923,7 +2948,7 @@ fit_canvas_to_selection(SPDesktop *desktop)
     }
     Geom::OptRect const bbox(desktop->selection->bounds());
     if (bbox) {
-        doc->fitToRect(*bbox);
+        doc->fitToRect(*bbox, with_margins);
         return true;
     } else {
         return false;
@@ -2942,8 +2967,12 @@ verb_fit_canvas_to_selection(SPDesktop *const desktop)
     }
 }
 
+/**
+ * \param with_margins margins defined in the xml under <sodipodi:namedview>
+ *                     "fit-margin-..." attributes.  See SPDocument::fitToRect.
+ */
 bool
-fit_canvas_to_drawing(SPDocument *doc)
+fit_canvas_to_drawing(SPDocument *doc, bool with_margins)
 {
     g_return_val_if_fail(doc != NULL, false);
 
@@ -2951,7 +2980,7 @@ fit_canvas_to_drawing(SPDocument *doc)
     SPItem const *const root = SP_ITEM(doc->root);
     Geom::OptRect const bbox(root->getBounds(sp_item_i2d_affine(root)));
     if (bbox) {
-        doc->fitToRect(*bbox);
+        doc->fitToRect(*bbox, with_margins);
         return true;
     } else {
         return false;
@@ -2967,6 +2996,11 @@ verb_fit_canvas_to_drawing(SPDesktop *desktop)
     }
 }
 
+/**
+ * Fits canvas to selection or drawing with margins from <sodipodi:namedview>
+ * "fit-margin-..." attributes.  See SPDocument::fitToRect and
+ * ui/dialog/page-sizer.
+ */
 void fit_canvas_to_selection_or_drawing(SPDesktop *desktop) {
     g_return_if_fail(desktop != NULL);
     SPDocument *doc = sp_desktop_document(desktop);
@@ -2975,8 +3009,8 @@ void fit_canvas_to_selection_or_drawing(SPDesktop *desktop) {
     g_return_if_fail(desktop->selection != NULL);
 
     bool const changed = ( desktop->selection->isEmpty()
-                           ? fit_canvas_to_drawing(doc)
-                           : fit_canvas_to_selection(desktop) );
+                           ? fit_canvas_to_drawing(doc, true)
+                           : fit_canvas_to_selection(desktop, true) );
     if (changed) {
         sp_document_done(sp_desktop_document(desktop), SP_VERB_FIT_CANVAS_TO_SELECTION_OR_DRAWING,
                          _("Fit Page to Selection or Drawing"));