Fix 2116947: "Pasting/importing across different image areas". When pasting nested...
authordooglus <dooglus@1f10aa63-cdf2-0310-b900-c93c546f37ac>
Fri, 14 Nov 2008 17:52:30 +0000 (17:52 +0000)
committerdooglus <dooglus@1f10aa63-cdf2-0310-b900-c93c546f37ac>
Fri, 14 Nov 2008 17:52:30 +0000 (17:52 +0000)
git-svn-id: https://synfig.svn.sourceforge.net/svnroot/synfig@2200 1f10aa63-cdf2-0310-b900-c93c546f37ac

synfig-core/trunk/src/synfig/layer_pastecanvas.cpp
synfig-core/trunk/src/synfig/layer_pastecanvas.h
synfig-studio/trunk/src/gtkmm/layeractionmanager.cpp

index e456a03..2423392 100644 (file)
@@ -241,6 +241,24 @@ Layer_PasteCanvas::set_sub_canvas(etl::handle<synfig::Canvas> x)
                on_canvas_set();
 }
 
+// when a pastecanvas that contains another pastecanvas is copy/pasted
+// from one document to another, only the outermost pastecanvas was
+// getting its renddesc set to match that of its new parent.  this
+// function is used to recurse through the pastecanvas copying its
+// renddesc to any pastecanvases it contains (bug #2116947, svn r2200)
+void
+Layer_PasteCanvas::update_renddesc()
+{
+       if(!get_canvas() || !canvas || !canvas->is_inline()) return;
+
+       canvas->rend_desc()=get_canvas()->rend_desc();
+       for (Context context = canvas->get_context(); !context->empty(); context++)
+       {
+               etl::handle<Layer_PasteCanvas> paste = etl::handle<Layer_PasteCanvas>::cast_dynamic(*context);
+               if (paste) paste->update_renddesc();
+       }
+}
+
 // This is called whenever the parent canvas gets set/changed
 void
 Layer_PasteCanvas::on_canvas_set()
index 843ee1e..3a3811e 100644 (file)
@@ -99,6 +99,8 @@ private:
        bool extra_reference;
 public:
 
+       void update_renddesc();
+
        virtual void on_canvas_set();
 
        void set_muck_with_time(bool x=false) { muck_with_time_=x; }
index 5b7834c..26769ff 100644 (file)
@@ -33,6 +33,7 @@
 #include "layeractionmanager.h"
 #include "layertree.h"
 #include <synfig/context.h>
+#include <synfig/layer_pastecanvas.h>
 #include <synfigapp/action_param.h>
 #include "instance.h"
 #include <synfigapp/selectionmanager.h>
@@ -400,6 +401,9 @@ LayerActionManager::paste()
                        return;
                }
 
+               etl::handle<Layer_PasteCanvas> paste = etl::handle<Layer_PasteCanvas>::cast_dynamic(layer);
+               if (paste) paste->update_renddesc();
+
                // synfig::info("DEPTH=%d",depth);
 
                // Action to move the layer (if necessary)