Author: rgheck
Date: Sun Dec  4 00:20:18 2011
New Revision: 40357
URL: http://www.lyx.org/trac/changeset/40357

Log:
Fix #7923: Don't clone all the children on autosave.

We split Buffer::clone() into various routines that know whether
to clone the children.

Modified:
   lyx-devel/trunk/src/Buffer.cpp
   lyx-devel/trunk/src/Buffer.h
   lyx-devel/trunk/src/frontends/qt4/GuiView.cpp

Modified: lyx-devel/trunk/src/Buffer.cpp
==============================================================================
--- lyx-devel/trunk/src/Buffer.cpp      Sun Dec  4 00:15:04 2011        (r40356)
+++ lyx-devel/trunk/src/Buffer.cpp      Sun Dec  4 00:20:18 2011        (r40357)
@@ -462,13 +462,13 @@
 }
 
 
-Buffer * Buffer::clone() const
+Buffer * Buffer::cloneFromMaster() const
 {
        BufferMap bufmap;
        cloned_buffers.push_back(new CloneList());
        CloneList * clones = cloned_buffers.back();
 
-       masterBuffer()->clone(bufmap, clones);
+       masterBuffer()->cloneWithChildren(bufmap, clones);
 
        // make sure we got cloned
        BufferMap::const_iterator bit = bufmap.find(this);
@@ -479,7 +479,7 @@
 }
 
 
-void Buffer::clone(BufferMap & bufmap, CloneList * clones) const
+void Buffer::cloneWithChildren(BufferMap & bufmap, CloneList * clones) const
 {
        // have we already been cloned?
        if (bufmap.find(this) != bufmap.end())
@@ -502,7 +502,7 @@
                dit.setBuffer(buffer_clone);
                Buffer * child = const_cast<Buffer *>(it->second.second);
 
-               child->clone(bufmap, clones);
+               child->cloneWithChildren(bufmap, clones);
                BufferMap::iterator const bit = bufmap.find(child);
                LASSERT(bit != bufmap.end(), continue);
                Buffer * child_clone = bit->second;
@@ -520,6 +520,14 @@
 }
 
 
+Buffer * Buffer::cloneBufferOnly() const {
+       Buffer * buffer_clone = new Buffer(fileName().absFileName(), false, 
this);
+       // we won't be cloning the children
+       buffer_clone->d->children_positions.clear();
+       return buffer_clone;
+}
+
+
 bool Buffer::isClone() const
 {
        return d->cloned_buffer_;

Modified: lyx-devel/trunk/src/Buffer.h
==============================================================================
--- lyx-devel/trunk/src/Buffer.h        Sun Dec  4 00:15:04 2011        (r40356)
+++ lyx-devel/trunk/src/Buffer.h        Sun Dec  4 00:20:18 2011        (r40357)
@@ -168,8 +168,11 @@
        /// Destructor
        ~Buffer();
 
-       ///
-       Buffer * clone() const;
+       /// Clones the entire structure of which this Buffer is part, starting
+       /// with the master and cloning all the children, too.
+       Buffer * cloneFromMaster() const;
+       /// Just clones this single Buffer. For autosave.
+       Buffer * cloneBufferOnly() const;
        ///
        bool isClone() const;
 
@@ -232,7 +235,7 @@
        ///
        typedef std::map<Buffer const *, Buffer *> BufferMap;
        ///
-       void clone(BufferMap &, CloneList *) const;
+       void cloneWithChildren(BufferMap &, CloneList *) const;
        /// save timestamp and checksum of the given file.
        void saveCheckSum() const;
        /// read a new file

Modified: lyx-devel/trunk/src/frontends/qt4/GuiView.cpp
==============================================================================
--- lyx-devel/trunk/src/frontends/qt4/GuiView.cpp       Sun Dec  4 00:15:04 
2011        (r40356)
+++ lyx-devel/trunk/src/frontends/qt4/GuiView.cpp       Sun Dec  4 00:20:18 
2011        (r40357)
@@ -1575,7 +1575,7 @@
 #if (QT_VERSION >= 0x040400)
        GuiViewPrivate::busyBuffers.insert(buffer);
        QFuture<docstring> f = 
QtConcurrent::run(GuiViewPrivate::autosaveAndDestroy,
-               buffer, buffer->clone());
+               buffer, buffer->cloneBufferOnly());
        d.autosave_watcher_.setFuture(f);
 #else
        buffer->autoSave();
@@ -3122,7 +3122,7 @@
        QFuture<Buffer::ExportStatus> f = QtConcurrent::run(
                                asyncFunc,
                                used_buffer,
-                               used_buffer->clone(),
+                               used_buffer->cloneFromMaster(),
                                format);
        setPreviewFuture(f);
        last_export_format = used_buffer->params().bufferFormat();

Reply via email to