mirror of
https://git.lyx.org/repos/lyx.git
synced 2025-01-03 08:28:25 +00:00
Second tentative fix to #8159: Undo doesn't restore environment depth correctly
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.
This commit is contained in:
parent
5b531b56ef
commit
8f01556236
@ -4413,7 +4413,17 @@ void Buffer::updateBuffer(ParIterator & parit, UpdateType utype) const
|
|||||||
pit_type const lastpit = parit.lastpit();
|
pit_type const lastpit = parit.lastpit();
|
||||||
for ( ; parit.pit() <= lastpit ; ++parit.pit()) {
|
for ( ; parit.pit() <= lastpit ; ++parit.pit()) {
|
||||||
// reduce depth if necessary
|
// 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();
|
maxdepth = parit->getMaxDepthAfter();
|
||||||
|
|
||||||
if (utype == OutputUpdate) {
|
if (utype == OutputUpdate) {
|
||||||
|
@ -1132,8 +1132,13 @@ static docstring makeDispatchMessage(docstring const & msg,
|
|||||||
|
|
||||||
void GuiApplication::dispatch(FuncRequest const & cmd)
|
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();
|
current_view_->currentBufferView()->cursor().saveBeforeDispatchPosXY();
|
||||||
|
buffer = ¤t_view_->currentBufferView()->buffer();
|
||||||
|
if (buffer)
|
||||||
|
buffer->undo().beginUndoGroup();
|
||||||
|
}
|
||||||
|
|
||||||
DispatchResult dr;
|
DispatchResult dr;
|
||||||
// redraw the screen at the end (first of the two drawing steps).
|
// 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);
|
dr.screenUpdate(Update::FitCursor);
|
||||||
dispatch(cmd, dr);
|
dispatch(cmd, dr);
|
||||||
updateCurrentView(cmd, dr);
|
updateCurrentView(cmd, dr);
|
||||||
|
|
||||||
|
// the buffer may have been closed by one action
|
||||||
|
if (theBufferList().isLoaded(buffer))
|
||||||
|
buffer->undo().endUndoGroup();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user