X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FBufferView.C;h=2ff1ec0a0736a88c10920b725bf23ac2072a96af;hb=ca6838b288daf07eec7d7a381d74c639c0de3a46;hp=67bbf5d530b1d30a6a1e5b9ea69255f8332711d0;hpb=3314702bf166367e1883b90fc47367c88ddf72fd;p=lyx.git diff --git a/src/BufferView.C b/src/BufferView.C index 67bbf5d530..2ff1ec0a07 100644 --- a/src/BufferView.C +++ b/src/BufferView.C @@ -88,7 +88,6 @@ using support::fileSearch; using support::isDirWriteable; using support::isFileReadable; using support::makeDisplayPath; -using support::makeAbsPath; using support::package; using std::distance; @@ -125,7 +124,7 @@ BufferView::BufferView() : width_(0), height_(0), buffer_(0), wh_(0), cursor_(*this), multiparsel_cache_(false), anchor_ref_(0), offset_ref_(0), - intl_(new Intl) + intl_(new Intl), last_inset_(0) { xsel_cache_.set = false; intl_->initKeyMapper(lyxrc.use_kbmap); @@ -302,7 +301,7 @@ void BufferView::resize() lyxerr[Debug::DEBUG] << BOOST_CURRENT_FUNCTION << endl; buffer_->text().init(this); - update(); + updateMetrics(false); switchKeyMap(); } @@ -334,7 +333,7 @@ bool BufferView::multiParSel() } -std::pair BufferView::update(Update::flags flags) +bool BufferView::update(Update::flags flags) { // This is close to a hot-path. if (lyxerr.debugging(Debug::DEBUG)) { @@ -348,7 +347,7 @@ std::pair BufferView::update(Update::flags flags) // Check needed to survive LyX startup if (!buffer_) - return make_pair(false, false); + return false; if (lyxerr.debugging(Debug::WORKAREA)) { lyxerr[Debug::WORKAREA] << "BufferView::update" << std::endl; @@ -363,16 +362,16 @@ std::pair BufferView::update(Update::flags flags) // Case when no explicit update is requested. if (!flags) { - // no need to do anything. - return make_pair(false, false); + // no need to redraw anything. + return false; } if (flags == Update::FitCursor) { bool const fit_cursor = fitCursor(); if (fit_cursor) updateMetrics(false); - // tell the frontend to update the screen. - return make_pair(fit_cursor, false); + // tell the frontend to update the screen if needed. + return fit_cursor; } bool full_metrics = flags & Update::Force; @@ -386,7 +385,7 @@ std::pair BufferView::update(Update::flags flags) updateMetrics(false); // tell the frontend to update the screen. - return make_pair(true, single_par); + return true; } @@ -721,7 +720,7 @@ bool BufferView::dispatch(FuncRequest const & cmd) break; case LFUN_FONT_STATE: - cur.message(from_utf8(cur.currentState())); + cur.message(cur.currentState()); break; case LFUN_BOOKMARK_SAVE: @@ -1013,21 +1012,20 @@ void BufferView::clearSelection() void BufferView::workAreaResize(int width, int height) { - bool const widthChange = width != width_; - bool const heightChange = height != height_; - + // A resize is triggered whenever a window gets focus, + // because of the shared rows() of a buffer in multiple + // buffer views. + // Update from work area width_ = width; height_ = height; if (buffer_) resize(); - - update(); } -std::pair BufferView::workAreaDispatch(FuncRequest const & cmd0) +bool BufferView::workAreaDispatch(FuncRequest const & cmd0) { //lyxerr << BOOST_CURRENT_FUNCTION << "[ cmd0 " << cmd0 << "]" << endl; @@ -1037,7 +1035,7 @@ std::pair BufferView::workAreaDispatch(FuncRequest const & cmd0) // E.g. Qt mouse press when no buffer if (!buffer_) - return make_pair(false, false); + return false; LCursor cur(*this); cur.push(buffer_->inset()); @@ -1055,23 +1053,50 @@ std::pair BufferView::workAreaDispatch(FuncRequest const & cmd0) //lyxerr << BOOST_CURRENT_FUNCTION // << " * created temp cursor:" << cur << endl; - // NOTE: eidtXY returns the top level inset of nested insets. If you happen + // NOTE: editXY returns the top level inset of nested insets. If you happen // to move from a text (inset=0) to a text inside an inset (e.g. an opened // footnote inset, again inset=0), that inset will not be redrawn. - static InsetBase * last_inset = NULL; if (cmd.action == LFUN_MOUSE_MOTION && cmd.button() == mouse_button::none) { - bool need_update = false; + bool need_redraw = false; - if (inset != last_inset) { - if (last_inset) - need_update |= last_inset->setMouseHover(false); + if (inset != last_inset_) { + if (last_inset_) + need_redraw |= last_inset_->setMouseHover(false); if (inset) - need_update |= inset->setMouseHover(true); - last_inset = inset; + need_redraw |= inset->setMouseHover(true); + last_inset_ = inset; + } + + // if last metrics update was in singlepar mode, WorkArea::redraw() will + // not expose the button for redraw. We adjust here the metrics dimension + // to enable a full redraw. + // FIXME: It is possible to redraw only the area around the button! + if (need_redraw && metrics_info_.singlepar) { + // FIXME: It should be possible to redraw only the area around + // the button by doing this: + // + //metrics_info_.singlepar = false; + //metrics_info_.y1 = ymin of button; + //metrics_info_.y2 = ymax of button; + // + // Unfortunately, rowpainter.C:paintText() does not distinguish + // between background updates and text updates. So we use the hammer + // solution for now. We could also avoid the updateMetrics() below + // by using the first and last pit of the CoordCache. Have a look + // at LyXText::getPitNearY() to see what I mean. + // + //metrics_info_.pit1 = first pit of CoordCache; + //metrics_info_.pit2 = last pit of CoordCache; + //metrics_info_.singlepar = false; + //metrics_info_.y1 = 0; + //metrics_info_.y2 = height_; + // + updateMetrics(false); } + // This event (moving without mouse click) is not passed further. // This should be changed if it is further utilized. - return make_pair(need_update, need_update); + return need_redraw; } // Put anchor at the same position. @@ -1094,8 +1119,7 @@ std::pair BufferView::workAreaDispatch(FuncRequest const & cmd0) if (cur.result().dispatched() && cur.result().update()) return update(cur.result().update()); - // When the above and the inner function are fixed, we can do this: - return make_pair(false, false); + return false; } @@ -1182,7 +1206,7 @@ void BufferView::setCursor(DocIterator const & dit) } -void BufferView::mouseSetCursor(LCursor & cur) +bool BufferView::mouseSetCursor(LCursor & cur) { BOOST_ASSERT(&cur.bv() == this); @@ -1193,14 +1217,15 @@ void BufferView::mouseSetCursor(LCursor & cur) // do the dEPM magic if needed // FIXME: move this to InsetText::notifyCursorLeaves? + bool update = false; if (!badcursor && cursor_.inTexted()) - cursor_.text()->deleteEmptyParagraphMechanism(cur, cursor_); + update = cursor_.text()->deleteEmptyParagraphMechanism(cur, cursor_); cursor_ = cur; cursor_.clearSelection(); cursor_.setTargetX(); finishUndo(); - + return update; } @@ -1367,7 +1392,7 @@ void BufferView::menuInsertLyXFile(string const & filenm) if (buffer_) { string const trypath = buffer_->filePath(); // If directory is writeable, use this as default. - if (isDirWriteable(trypath)) + if (isDirWriteable(FileName(trypath))) initpath = trypath; }