: 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);
lyxerr[Debug::DEBUG] << BOOST_CURRENT_FUNCTION << endl;
buffer_->text().init(this);
- update();
+ updateMetrics(false);
switchKeyMap();
}
}
-std::pair<bool, bool> BufferView::update(Update::flags flags)
+bool BufferView::update(Update::flags flags)
{
// This is close to a hot-path.
if (lyxerr.debugging(Debug::DEBUG)) {
// 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;
// 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;
updateMetrics(false);
// tell the frontend to update the screen.
- return make_pair(true, single_par);
+ return true;
}
break;
case LFUN_FILE_INSERT:
- // FIXME: We don't know the encoding of filenames
+ // FIXME UNICODE
menuInsertLyXFile(to_utf8(cmd.argument()));
break;
case LFUN_FILE_INSERT_ASCII_PARA:
- // FIXME: We don't know the encoding of filenames
+ // FIXME UNICODE
insertAsciiFile(this, to_utf8(cmd.argument()), true);
break;
case LFUN_FILE_INSERT_ASCII:
- // FIXME: We don't know the encoding of filenames
+ // FIXME UNICODE
insertAsciiFile(this, to_utf8(cmd.argument()), false);
break;
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<bool, bool> BufferView::workAreaDispatch(FuncRequest const & cmd0)
+bool BufferView::workAreaDispatch(FuncRequest const & cmd0)
{
//lyxerr << BOOST_CURRENT_FUNCTION << "[ cmd0 " << cmd0 << "]" << endl;
// E.g. Qt mouse press when no buffer
if (!buffer_)
- return make_pair(false, false);
+ return false;
LCursor cur(*this);
cur.push(buffer_->inset());
//lyxerr << BOOST_CURRENT_FUNCTION
// << " * created temp cursor:" << cur << endl;
+ // 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.
+ if (cmd.action == LFUN_MOUSE_MOTION && cmd.button() == mouse_button::none) {
+ bool need_redraw = false;
+
+ if (inset != last_inset_) {
+ if (last_inset_)
+ need_redraw |= last_inset_->setMouseHover(false);
+ if (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 need_redraw;
+ }
+
// Put anchor at the same position.
cur.resetAnchor();
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;
}
}
-void BufferView::mouseSetCursor(LCursor & cur)
+bool BufferView::mouseSetCursor(LCursor & cur)
{
BOOST_ASSERT(&cur.bv() == this);
// 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;
}