Inset * inset = it.nextInset();
if (inset && inset->lyxCode() == code)
return static_cast<T*>(inset);
- return 0;
+ return nullptr;
}
}
-/// Looks for next inset with the given code
-void findInset(DocIterator & dit, InsetCode code, bool same_content)
-{
- findInset(dit, vector<InsetCode>(1, code), same_content);
-}
-
-
/// Moves cursor to the next inset with one of the given codes.
void gotoInset(BufferView * bv, vector<InsetCode> const & codes,
bool same_content)
}
-/// Moves cursor to the next inset with given code.
-void gotoInset(BufferView * bv, InsetCode code, bool same_content)
-{
- gotoInset(bv, vector<InsetCode>(1, code), same_content);
-}
-
-
/// A map from a Text to the associated text metrics
typedef map<Text const *, TextMetrics> TextMetricsCache;
Private(BufferView & bv) :
update_strategy_(FullScreenUpdate),
update_flags_(Update::Force),
- wh_(0), cursor_(bv),
- anchor_pit_(0), anchor_ypos_(0),
- inlineCompletionUniqueChars_(0),
- last_inset_(0), clickable_inset_(false),
- mouse_position_cache_(),
- bookmark_edit_position_(-1), gui_(0),
- horiz_scroll_offset_(0)
+ cursor_(bv), anchor_pit_(0), anchor_ypos_(0),
+ wh_(0), inlineCompletionUniqueChars_(0),
+ last_inset_(nullptr), mouse_position_cache_(),
+ gui_(nullptr), bookmark_edit_position_(-1),
+ horiz_scroll_offset_(0), clickable_inset_(false)
{
xsel_cache_.set = false;
}
typedef map<MathData const *, MathRow> MathRows;
MathRows math_rows_;
- /// Estimated average par height for scrollbar.
- int wh_;
/// this is used to handle XSelection events in the right manner.
struct {
CursorSlice cursor;
pit_type anchor_pit_;
///
int anchor_ypos_;
+ /// Estimated average par height for scrollbar.
+ int wh_;
///
vector<int> par_height_;
* Not owned, so don't delete.
*/
Inset const * last_inset_;
- /// are we hovering something that we can click
- bool clickable_inset_;
/// position of the mouse at the time of the last mouse move
/// This is used to update the hovering status of inset in
/// cases where the buffer is scrolled, but the mouse didn't move.
Point mouse_position_cache_;
- // cache for id of the paragraph which was edited the last time
- int bookmark_edit_position_;
-
mutable TextMetricsCache text_metrics_;
/// Whom to notify.
/// When the row where the cursor lies is scrolled, this
/// contains the scroll offset
+ // cache for id of the paragraph which was edited the last time
+ int bookmark_edit_position_;
+
int horiz_scroll_offset_;
/// a slice pointing to the start of the row where the cursor
/// is (at last draw time)
CursorSlice current_row_slice_;
+ /// are we hovering something that we can click
+ bool clickable_inset_;
};
}
+int BufferView::topMargin() const
+{
+ // original value was 20px, which is 0.2in at 100dpi
+ return zoomedPixels(20);
+}
+
+
+int BufferView::bottomMargin() const
+{
+ // original value was 20px, which is 0.2in at 100dpi
+ return zoomedPixels(20);
+}
+
+
int BufferView::inPixels(Length const & len) const
{
Font const font = buffer().params().getFont();
// First try to make the selection start visible
// (which is just the cursor when there is no selection)
scrollToCursor(d->cursor_.selectionBegin(), false);
+ // Metrics have to be recomputed (maybe again)
+ updateMetrics();
// Is the cursor visible? (only useful if cursor is at end of selection)
- if (needsFitCursor())
+ if (needsFitCursor()) {
// then try to make cursor visible instead
scrollToCursor(d->cursor_, false);
- // Metrics have to be recomputed (maybe again)
- updateMetrics(flags);
+ // Metrics have to be recomputed (maybe again)
+ updateMetrics(flags);
+ }
}
flags = flags & ~Update::FitCursor;
}
if (height_ == 0)
return false;
- LYXERR(Debug::SCROLLING, "recentering!");
+ if (recenter)
+ LYXERR(Debug::SCROLLING, "recentering and scrolling to cursor");
+ else
+ LYXERR(Debug::SCROLLING, "scrolling to cursor");
CursorSlice const & bot = dit.bottom();
TextMetrics & tm = d->text_metrics_[bot.text()];
Inset * BufferView::editedInset(string const & name) const
{
map<string, Inset *>::const_iterator it = d->edited_insets_.find(name);
- return it == d->edited_insets_.end() ? 0 : it->second;
+ return it == d->edited_insets_.end() ? nullptr : it->second;
}
}
case LFUN_NOTE_NEXT:
- gotoInset(this, NOTE_CODE, false);
+ gotoInset(this, { NOTE_CODE }, false);
+ // FIXME: if SinglePar is changed to act on the inner
+ // paragraph, this will not be OK anymore. The update is
+ // useful for auto-open collapsible insets.
+ dr.screenUpdate(Update::SinglePar | Update::FitCursor);
break;
case LFUN_REFERENCE_NEXT: {
- vector<InsetCode> tmp;
- tmp.push_back(LABEL_CODE);
- tmp.push_back(REF_CODE);
- gotoInset(this, tmp, true);
+ gotoInset(this, { LABEL_CODE, REF_CODE }, true);
+ // FIXME: if SinglePar is changed to act on the inner
+ // paragraph, this will not be OK anymore. The update is
+ // useful for auto-open collapsible insets.
+ dr.screenUpdate(Update::SinglePar | Update::FitCursor);
break;
}
case LFUN_BIBTEX_DATABASE_ADD: {
Cursor tmpcur = cur;
- findInset(tmpcur, BIBTEX_CODE, false);
+ findInset(tmpcur, { BIBTEX_CODE }, false);
InsetBibtex * inset = getInsetByCode<InsetBibtex>(tmpcur,
BIBTEX_CODE);
if (inset) {
case LFUN_BIBTEX_DATABASE_DEL: {
Cursor tmpcur = cur;
- findInset(tmpcur, BIBTEX_CODE, false);
+ findInset(tmpcur, { BIBTEX_CODE }, false);
InsetBibtex * inset = getInsetByCode<InsetBibtex>(tmpcur,
BIBTEX_CODE);
if (inset) {
}
-docstring const BufferView::requestSelection()
+docstring BufferView::requestSelection()
{
Cursor & cur = d->cursor_;
TextMetrics & tm = d->text_metrics_[&text];
Inset * inset = tm.checkInsetHit(x, y);
if (!inset)
- return 0;
+ return nullptr;
if (!inset->descendable(*this))
// No need to go further down if the inset is not
if (d->last_inset_) {
// Remove the hint on the last hovered inset (if any).
need_redraw |= d->last_inset_->setMouseHover(this, false);
- d->last_inset_ = 0;
+ d->last_inset_ = nullptr;
}
if (covering_inset && covering_inset->setMouseHover(this, true)) {
LYXERR0("Wrong last_inset!");
LATTEST(false);
}
- d->last_inset_ = 0;
+ d->last_inset_ = nullptr;
}
Text & buftext = buffer_.text();
pit_type const bottom_pit = d->cursor_.bottom().pit();
TextMetrics & tm = textMetrics(&buftext);
- int old_height = tm.parMetrics(bottom_pit).height();
+ Dimension const old_dim = tm.parMetrics(bottom_pit).dim();
// make sure inline completion pointer is ok
if (d->inlineCompletionPos_.fixIfBroken())
// (if this paragraph contains insets etc., rebreaking will
// recursively descend)
tm.redoParagraph(bottom_pit);
- ParagraphMetrics const & pm = tm.parMetrics(bottom_pit);
- if (pm.height() != old_height)
+ ParagraphMetrics & pm = tm.parMetrics(bottom_pit);
+ if (pm.height() != old_dim.height()) {
// Paragraph height has changed so we cannot proceed to
// the singlePar optimisation.
return false;
+ }
+ // Since position() points to the baseline of the first row, we
+ // may have to update it. See ticket #11601 for an example where
+ // the height does not change but the ascent does.
+ pm.setPosition(pm.position() - old_dim.ascent() + pm.ascent());
tm.updatePosCache(bottom_pit);
// Rebreak anchor paragraph.
tm.redoParagraph(d->anchor_pit_);
- ParagraphMetrics & anchor_pm = tm.par_metrics_[d->anchor_pit_];
+ ParagraphMetrics & anchor_pm = tm.parMetrics(d->anchor_pit_);
// position anchor
if (d->anchor_pit_ == 0) {
pit_type pit1 = d->anchor_pit_ - 1;
for (; pit1 >= 0 && y1 >= 0; --pit1) {
tm.redoParagraph(pit1);
- ParagraphMetrics & pm = tm.par_metrics_[pit1];
+ ParagraphMetrics & pm = tm.parMetrics(pit1);
y1 -= pm.descent();
// Save the paragraph position in the cache.
pm.setPosition(y1);
pit_type pit2 = d->anchor_pit_ + 1;
for (; pit2 < npit && y2 <= height_; ++pit2) {
tm.redoParagraph(pit2);
- ParagraphMetrics & pm = tm.par_metrics_[pit2];
+ ParagraphMetrics & pm = tm.parMetrics(pit2);
y2 += pm.ascent();
// Save the paragraph position in the cache.
pm.setPosition(y2);