THis is a consequence of the new AtPoint mechanism. In the old
world, recordUndoInset was called before INSET_MODIFY. I reintroduced
manual recordUndoInset calls in all places that matter. I suspect
that this issue should be revisited later.
Note that recordUndoInset can now take an optional parameter that tells
what inset is concerned. This is useful because the cursor can be
either just inside the inset or in front of it.
git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@36580
a592a061-630c-0410-9148-
cb99ea01b6c8
disp_ = DispatchResult();
buffer()->undo().beginUndoGroup();
-
+
// Is this a function that acts on inset at point?
if (lyxaction.funcHasFlag(cmd.action(), LyXAction::AtPoint)
&& nextInset()) {
}
-void Cursor::recordUndoInset(UndoKind kind) const
+void Cursor::recordUndoInset(UndoKind kind, Inset const * inset) const
{
- buffer()->undo().recordUndoInset(*this, kind);
+ buffer()->undo().recordUndoInset(*this, kind, inset);
}
void recordUndo(UndoKind kind = ATOMIC_UNDO) const;
/// Convenience: prepare undo for the inset containing the cursor
- void recordUndoInset(UndoKind kind = ATOMIC_UNDO) const;
+ void recordUndoInset(UndoKind kind = ATOMIC_UNDO,
+ Inset const * inset = 0) const;
/// Convenience: prepare undo for the whole buffer
void recordUndoFullDocument() const;
}
-void Undo::recordUndoInset(DocIterator const & cur, UndoKind kind)
+void Undo::recordUndoInset(DocIterator const & cur, UndoKind kind,
+ Inset const * inset)
{
- DocIterator c = cur;
- c.pop_back();
- d->doRecordUndo(kind, c, c.pit(), c.pit(), cur, false, d->undostack_);
+ if (!inset || inset == &cur.inset()) {
+ DocIterator c = cur;
+ c.pop_back();
+ d->doRecordUndo(kind, c, c.pit(), c.pit(),
+ cur, false, d->undostack_);
+ } else if (inset == cur.nextInset())
+ recordUndo(cur, kind);
+ else
+ LYXERR0("Inset not found, no undo stack added.");
}
class Buffer;
class BufferParams;
class DocIterator;
+class Inset;
class MathData;
class ParagraphList;
/// Convenience: record undo information for the inset
/// containing the cursor.
- void recordUndoInset(DocIterator const & cur,
- UndoKind kind = ATOMIC_UNDO);
+ void recordUndoInset(DocIterator const & cur,
+ UndoKind kind = ATOMIC_UNDO,
+ Inset const * inset = 0);
/// Convenience: prepare undo for the whole buffer
void recordUndoFullDocument(DocIterator const & cur);
case LFUN_INSET_MODIFY: {
//lyxerr << "InsetBox::dispatch MODIFY" << endl;
- if (cmd.getArg(0) == "changetype")
+ if (cmd.getArg(0) == "changetype") {
+ cur.recordUndoInset(ATOMIC_UNDO, this);
params_.type = cmd.getArg(1);
- else
+ } else
string2params(to_utf8(cmd.argument()), params_);
setButtonLabel();
break;
switch (cmd.action()) {
case LFUN_INSET_MODIFY: {
if (cmd.getArg(0) == "changetype") {
+ cur.recordUndo();
p_.setCmdName(cmd.getArg(1));
cur.forceBufferUpdate();
initView();
// child_buffer_ = 0;
InsetCommandParams p(INCLUDE_CODE);
if (cmd.getArg(0) == "changetype") {
+ cur.recordUndo();
InsetCommand::doDispatch(cur, cmd);
p = params();
} else
case LFUN_INSET_MODIFY: {
if (cmd.getArg(0) == "changetype") {
+ cur.recordUndoInset(ATOMIC_UNDO, this);
params_.index = from_utf8(cmd.getArg(1));
break;
}
cmd = subst(cmd, "printindex", "printsubindex");
else
cmd = subst(cmd, "printsubindex", "printindex");
+ cur.recordUndo();
setCmdName(cmd);
break;
} else if (cmd.argument() == from_ascii("check-printindex*")) {
if (suffixIs(cmd, '*'))
break;
cmd += '*';
+ cur.recordUndo();
setParam("type", docstring());
setCmdName(cmd);
break;
switch (cmd.action()) {
case LFUN_INSET_SETTINGS:
return InsetCollapsable::getStatus(cur, cmd, flag);
-
+
case LFUN_INSET_DIALOG_UPDATE:
case LFUN_INSET_COPY_AS:
flag.setEnabled(true);
return true;
-
+
case LFUN_INSET_MODIFY:
if (validateModifyArgument(cmd.argument())) {
flag.setEnabled(true);
return true;
}
//fall through
-
+
default:
return false;
}
{
switch (cmd.action()) {
case LFUN_INSET_MODIFY:
+ cur.recordUndo();
setInfo(to_utf8(cmd.argument()));
break;
#include "InsetNewline.h"
+#include "Cursor.h"
#include "Dimension.h"
#include "FuncRequest.h"
#include "FuncStatus.h"
case LFUN_INSET_MODIFY: {
InsetNewlineParams params;
+ cur.recordUndo();
string2params(to_utf8(cmd.argument()), params);
params_.kind = params.kind;
break;
#include "InsetNewpage.h"
+#include "Cursor.h"
#include "FuncRequest.h"
#include "FuncStatus.h"
#include "Lexer.h"
case LFUN_INSET_MODIFY: {
InsetNewpageParams params;
+ cur.recordUndo();
string2params(to_utf8(cmd.argument()), params);
params_.kind = params.kind;
break;
switch (cmd.action()) {
case LFUN_INSET_MODIFY:
+ cur.recordUndoInset(ATOMIC_UNDO, this);
string2params(to_utf8(cmd.argument()), params_);
setButtonLabel();
// what we really want here is a TOC update, but that means
switch (cmd.action()) {
case LFUN_INSET_MODIFY:
+ cur.recordUndoInset(ATOMIC_UNDO, this);
string2params(to_utf8(cmd.argument()), params_);
break;
{
switch (cmd.action()) {
case LFUN_INSET_MODIFY:
+ cur.recordUndoInset(ATOMIC_UNDO, this);
string2params(to_utf8(cmd.argument()), params_);
break;
default:
switch (cmd.action()) {
case LFUN_INSET_MODIFY:
+ cur.recordUndo();
string2params(to_utf8(cmd.argument()), params_);
break;
switch (cmd.action()) {
case LFUN_INSET_MODIFY: {
+ cur.recordUndo();
InsetVSpace::string2params(to_utf8(cmd.argument()), space_);
break;
}
if (cmd.getArg(0) == "mathspace") {
MathData ar;
if (createInsetMath_fromDialogStr(cmd.argument(), ar)) {
+ cur.recordUndo();
*this = *ar[0].nucleus()->asSpaceInset();
break;
}