int const height = 2 * defaultRowHeight();
int const first = height;
int const last = height_ - height;
- Cursor & cur = d->cursor_;
+ int newy = 0;
+ Cursor const & oldcur = d->cursor_;
- switch (cursorStatus(cur)) {
+ switch (cursorStatus(oldcur)) {
case CUR_ABOVE:
- // We reset the cursor because cursorStatus() does not
- // work when the cursor is within mathed.
- cur.reset(buffer_.inset());
- tm.setCursorFromCoordinates(cur, 0, first);
- cur.clearSelection();
+ newy = first;
break;
case CUR_BELOW:
- // We reset the cursor because cursorStatus() does not
- // work when the cursor is within mathed.
- cur.reset(buffer_.inset());
- tm.setCursorFromCoordinates(cur, 0, last);
- cur.clearSelection();
+ newy = last;
break;
case CUR_INSIDE:
- int const y = getPos(cur, cur.boundary()).y_;
- int const newy = min(last, max(y, first));
- if (y != newy) {
- cur.reset(buffer_.inset());
- tm.setCursorFromCoordinates(cur, 0, newy);
- }
+ int const y = getPos(oldcur, oldcur.boundary()).y_;
+ newy = min(last, max(y, first));
+ if (y == newy)
+ return;
}
+ // We reset the cursor because cursorStatus() does not
+ // work when the cursor is within mathed.
+ Cursor cur(*this);
+ cur.reset(buffer_.inset());
+ tm.setCursorFromCoordinates(cur, 0, newy);
+ mouseSetCursor(cur);
}
case LFUN_GRAPHICS_GROUPS_UNIFY: {
if (cmd.argument().empty())
break;
- //view()->cursor().recordUndoFullDocument(); let inset-apply do that job
graphics::unifyGraphicsGroups(cur.buffer(), to_utf8(cmd.argument()));
processUpdateFlags(Update::Force | Update::FitCursor);
break;
case LFUN_NOTES_MUTATE: {
if (cmd.argument().empty())
break;
- cur.recordUndoFullDocument();
if (mutateNotes(cur, cmd.getArg(0), cmd.getArg(1))) {
processUpdateFlags(Update::Force);
// Put anchor at the same position.
cur.resetAnchor();
+ cur.beginUndoGroup();
+
// Try to dispatch to an non-editable inset near this position
// via the temp cursor. If the inset wishes to change the real
// cursor it has to do so explicitly by using
if (!inset || !cur.result().dispatched())
cur.dispatch(cmd);
+ cur.endUndoGroup();
+
// Notify left insets
if (cur != old) {
old.fixIfBroken();
}
+bool BufferView::setCursorFromInset(Inset const * inset)
+{
+ // are we already there?
+ if (cursor().nextInset() == inset)
+ return true;
+
+ // Inset is not at cursor position. Find it in the document.
+ Cursor cur(*this);
+ cur.reset(buffer().inset());
+ do
+ cur.forwardInset();
+ while (cur && cur.nextInset() != inset);
+
+ if (cur) {
+ setCursor(cur);
+ return true;
+ }
+ return false;
+}
+
+
void BufferView::gotoLabel(docstring const & label)
{
Toc & toc = buffer().tocBackend().toc("label");