]> git.lyx.org Git - lyx.git/commitdiff
Second tentative fix to #8159: Undo doesn't restore environment depth correctly
authorJean-Marc Lasgouttes <lasgouttes@lyx.org>
Mon, 4 Jun 2012 16:02:59 +0000 (18:02 +0200)
committerJean-Marc Lasgouttes <lasgouttes@lyx.org>
Tue, 5 Jun 2012 09:32:56 +0000 (11:32 +0200)
In this version, the idea is to record undo at the place where the document is modified, which is definitely cleaner.

1/ in Buffer::updateBuffer, add a recordUndo, with the caveat that a
   const_cast has to be used

2/ in GuiApplication::dispatch, add an extra undo group that
   encompasses the updateBuffer call. Some other undo groups may be
   redundant now, but it is not a problem since they do not cost
   anything.

src/Buffer.cpp
src/frontends/qt4/GuiApplication.cpp

index 8fb72aecb1bd5475863309e635e41d0faadb8a6c..f8f5272e352241452131cff4e8a64896fdffcfd3 100644 (file)
@@ -4413,7 +4413,17 @@ void Buffer::updateBuffer(ParIterator & parit, UpdateType utype) const
        pit_type const lastpit = parit.lastpit();
        for ( ; parit.pit() <= lastpit ; ++parit.pit()) {
                // reduce depth if necessary
-               parit->params().depth(min(parit->params().depth(), maxdepth));
+               if (parit->params().depth() > maxdepth) {
+                       /** FIXME: this function is const, but
+                        * nevertheless it modifies the buffer. To be
+                        * cleaner, one should modify the buffer in
+                        * another function, which is actually
+                        * non-const. This would however be costly in
+                        * terms of code duplication.
+                        */
+                       const_cast<Buffer *>(this)->undo().recordUndo(parit);
+                       parit->params().depth(maxdepth);
+               }
                maxdepth = parit->getMaxDepthAfter();
 
                if (utype == OutputUpdate) {
index 2cec2e333ade2cde742a1cc14a06c1d3747a387a..b00fe2d5082fa78ad34cc5d74b8ac8fa3e8b973a 100644 (file)
@@ -1132,8 +1132,13 @@ static docstring makeDispatchMessage(docstring const & msg,
 
 void GuiApplication::dispatch(FuncRequest const & cmd)
 {
-       if (current_view_ && current_view_->currentBufferView())
+       Buffer * buffer = 0;
+       if (current_view_ && current_view_->currentBufferView()) {
                current_view_->currentBufferView()->cursor().saveBeforeDispatchPosXY();
+               buffer = &current_view_->currentBufferView()->buffer();
+               if (buffer)
+                       buffer->undo().beginUndoGroup();
+       }
 
        DispatchResult dr;
        // redraw the screen at the end (first of the two drawing steps).
@@ -1141,6 +1146,10 @@ void GuiApplication::dispatch(FuncRequest const & cmd)
        dr.screenUpdate(Update::FitCursor);
        dispatch(cmd, dr);
        updateCurrentView(cmd, dr);
+
+       // the buffer may have been closed by one action
+       if (theBufferList().isLoaded(buffer))
+               buffer->undo().endUndoGroup();
 }