X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FBufferView.cpp;h=8948b73d2de8b2d082807652a7069d802625336c;hb=948ed1ffd50923f3e63204c65a08cb308ebc4b63;hp=9d42f3d64c2c948885335c2027777364e9f48319;hpb=9c55af4a223ce4db29d643251109e245665344bd;p=lyx.git diff --git a/src/BufferView.cpp b/src/BufferView.cpp index 9d42f3d64c..8948b73d2d 100644 --- a/src/BufferView.cpp +++ b/src/BufferView.cpp @@ -227,7 +227,8 @@ enum ScreenUpdateStrategy { struct BufferView::Private { - Private(BufferView & bv): wh_(0), cursor_(bv), + Private(BufferView & bv) : update_strategy_(NoScreenUpdate), + wh_(0), cursor_(bv), anchor_pit_(0), anchor_ypos_(0), inlineCompletionUniqueChars_(0), last_inset_(0), clickable_inset_(false), @@ -1112,13 +1113,13 @@ bool BufferView::getStatus(FuncRequest const & cmd, FuncStatus & flag) iss >> opt; flag.setEnabled(opt.repl_buf_name.empty() || !buffer_.isReadonly()); + break; } - case LFUN_LABEL_GOTO: { + case LFUN_LABEL_GOTO: flag.setEnabled(!cmd.argument().empty() || getInsetByCode(cur, REF_CODE)); break; - } case LFUN_CHANGES_TRACK: flag.setEnabled(true); @@ -1251,7 +1252,7 @@ void BufferView::dispatch(FuncRequest const & cmd, DispatchResult & dr) case LFUN_BUFFER_PARAMS_APPLY: { DocumentClassConstPtr olddc = buffer_.params().documentClassPtr(); - cur.recordUndoFullDocument(); + cur.recordUndoBufferParams(); istringstream ss(to_utf8(cmd.argument())); Lexer lex; lex.setStream(ss); @@ -1272,7 +1273,10 @@ void BufferView::dispatch(FuncRequest const & cmd, DispatchResult & dr) } case LFUN_LAYOUT_MODULES_CLEAR: { - cur.recordUndoFullDocument(); + // FIXME: this modifies the document in cap::switchBetweenClasses + // without calling recordUndo. Fix this before using + // recordUndoBufferParams(). + cur.recordUndoFullBuffer(); buffer_.params().clearLayoutModules(); makeDocumentClass(); dr.screenUpdate(Update::Force); @@ -1288,7 +1292,10 @@ void BufferView::dispatch(FuncRequest const & cmd, DispatchResult & dr) "conflicts with installed modules."); break; } - cur.recordUndoFullDocument(); + // FIXME: this modifies the document in cap::switchBetweenClasses + // without calling recordUndo. Fix this before using + // recordUndoBufferParams(). + cur.recordUndoFullBuffer(); buffer_.params().addLayoutModule(argument); makeDocumentClass(); dr.screenUpdate(Update::Force); @@ -1317,7 +1324,10 @@ void BufferView::dispatch(FuncRequest const & cmd, DispatchResult & dr) break; // Save the old, possibly modular, layout for use in conversion. - cur.recordUndoFullDocument(); + // FIXME: this modifies the document in cap::switchBetweenClasses + // without calling recordUndo. Fix this before using + // recordUndoBufferParams(). + cur.recordUndoFullBuffer(); buffer_.params().setBaseClass(argument); makeDocumentClass(); dr.screenUpdate(Update::Force); @@ -1405,20 +1415,21 @@ void BufferView::dispatch(FuncRequest const & cmd, DispatchResult & dr) for (Buffer * b = &buffer_; i == 0 || b != &buffer_; b = theBufferList().next(b)) { - DocIterator dit = b->getParFromID(id); - if (dit.atEnd()) { + Cursor cur(*this); + cur.setCursor(b->getParFromID(id)); + if (cur.atEnd()) { LYXERR(Debug::INFO, "No matching paragraph found! [" << id << "]."); ++i; continue; } - LYXERR(Debug::INFO, "Paragraph " << dit.paragraph().id() + LYXERR(Debug::INFO, "Paragraph " << cur.paragraph().id() << " found in buffer `" << b->absFileName() << "'."); if (b == &buffer_) { // Set the cursor - dit.pos() = pos; - setCursor(dit); + cur.pos() = pos; + mouseSetCursor(cur); dr.screenUpdate(Update::Force | Update::FitCursor); } else { // Switch to other buffer view and resend cmd @@ -2028,7 +2039,7 @@ void BufferView::dispatch(FuncRequest const & cmd, DispatchResult & dr) if (!newL || oldL == newL) break; if (oldL->rightToLeft() == newL->rightToLeft()) { - cur.recordUndoFullDocument(); + cur.recordUndoFullBuffer(); buffer_.changeLanguage(oldL, newL); cur.setCurrentFont(); dr.forceBufferUpdate(); @@ -2961,6 +2972,19 @@ void BufferView::checkCursorScrollOffset(PainterInfo & pi) // Set the row on which the cursor lives. setCurrentRowSlice(rowSlice); + /** FIXME: the code below adds an extraneous computation of inset + * positions, and can therefore be bad for performance (think for + * example about a very large tabular inset. Redawing the row + * where it is means redrawing the whole screen). + * + * The bug that this fixes is the following: assume that there is + * a very large math inset. Upon entering the inset, when pressing + * `End', the row is not scrolled and the cursor is not visible. I + * am not sure why the extra row computation fixes the problem, + * actually. + * + * A proper fix should be found and this code should be removed. + */ // Force the recomputation of inset positions bool const drawing = pi.pain.isDrawingEnabled(); pi.pain.setDrawingEnabled(false); @@ -2969,13 +2993,14 @@ void BufferView::checkCursorScrollOffset(PainterInfo & pi) -d->horiz_scroll_offset_, 0); rp.paintText(); pi.pain.setDrawingEnabled(drawing); + /** END of bad code */ // Current x position of the cursor in pixels int const cur_x = getPos(d->cursor_).x_; // Horizontal scroll offset of the cursor row in pixels int offset = d->horiz_scroll_offset_; - int const MARGIN = Length(2, Length::EM).inPixels(workWidth()); + int const MARGIN = Length(2, Length::EM).inPixels(pi.base); if (cur_x < offset + MARGIN) { // scroll right offset = cur_x - MARGIN;