X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Fbufferview_funcs.cpp;h=3f132de962d585d3c1366832038f27a22a5988cc;hb=4734433a3ccc287a63fe48726e354e78bc481a81;hp=437ef71c5736965ab4ba3dec04e0da3117b6605b;hpb=40484482361a369bd77f1a6f41769127ea388a3d;p=lyx.git diff --git a/src/bufferview_funcs.cpp b/src/bufferview_funcs.cpp index 437ef71c57..3f132de962 100644 --- a/src/bufferview_funcs.cpp +++ b/src/bufferview_funcs.cpp @@ -175,14 +175,19 @@ Point coordOffset(BufferView const & bv, DocIterator const & dit, // of xx:yy if (sl.text()) { bool boundary_i = boundary && i + 1 == dit.depth(); - bool rtl = sl.text()->isRTL(bv.buffer(), sl, boundary_i); + bool rtl = bv.textMetrics(sl.text()).isRTL(sl, boundary_i); if (rtl) x -= lastw; + // remember width for the case that sl.inset() is positioned in an RTL inset + Dimension const & dim = bv.parMetrics(sl.text(), sl.pit()). + insetDimension(&sl.inset()); + lastw = dim.wid; + } else { + // remember width for the case that sl.inset() is positioned in an RTL inset + Dimension const dim = sl.inset().dimension(bv); + lastw = dim.wid; } - // remember width for the case that sl.inset() is positioned in an RTL inset - lastw = sl.inset().width(); - //lyxerr << "Cursor::getPos, i: " // << i << " x: " << xx << " y: " << y << endl; } @@ -211,15 +216,16 @@ Point coordOffset(BufferView const & bv, DocIterator const & dit, y += pm.rows()[rit].height(); y += pm.rows()[rend].ascent(); + TextMetrics const & bottom_tm = bv.textMetrics(dit.bottom().text()); + // Make relative position from the nested inset now bufferview absolute. - int xx = bv.textMetrics(dit.bottom().text()).cursorX( - dit.bottom(), boundary && dit.depth() == 1); + int xx = bottom_tm.cursorX(dit.bottom(), boundary && dit.depth() == 1); x += xx; // In the RTL case place the nested inset at the left of the cursor in // the outer paragraph bool boundary_1 = boundary && 1 == dit.depth(); - bool rtl = dit.bottom().text()->isRTL(bv.buffer(), dit.bottom(), boundary_1); + bool rtl = bottom_tm.isRTL(dit.bottom(), boundary_1); if (rtl) x -= lastw; @@ -230,19 +236,12 @@ Point coordOffset(BufferView const & bv, DocIterator const & dit, Point getPos(BufferView const & bv, DocIterator const & dit, bool boundary) { CursorSlice const & bot = dit.bottom(); - CoordCache::ParPosCache::const_iterator cache_it = - bv.coordCache().getParPos().find(bot.text()); - if (cache_it == bv.coordCache().getParPos().end()) + TextMetrics const & tm = bv.textMetrics(bot.text()); + if (!tm.has(bot.pit())) return Point(-1, -1); - CoordCache::InnerParPosCache const & cache = cache_it->second; - CoordCache::InnerParPosCache::const_iterator it = cache.find(bot.pit()); - if (it == cache.end()) { - //lyxerr << "cursor out of view" << std::endl; - return Point(-1, -1); - } Point p = coordOffset(bv, dit, boundary); // offset from outer paragraph - p.y_ += it->second.y_; + p.y_ += tm.parMetrics(bot.pit()).position(); return p; } @@ -251,15 +250,15 @@ Point getPos(BufferView const & bv, DocIterator const & dit, bool boundary) // FIXME: This does not work within mathed! CurStatus status(BufferView const * bv, DocIterator const & dit) { - CoordCache::InnerParPosCache const & cache = - bv->coordCache().getParPos().find(dit.bottom().text())->second; - - if (cache.find(dit.bottom().pit()) != cache.end()) - return CUR_INSIDE; - else if (dit.bottom().pit() < bv->anchor_ref()) + // FIXME: it's be better to have something like TextMetrics::status(). + TextMetrics const & tm = bv->textMetrics(dit.bottom().text()); + int par_pos = tm.parPosition(dit.bottom().pit()); + if (par_pos < 0) return CUR_ABOVE; - else + else if (par_pos > bv->workHeight()) return CUR_BELOW; + + return CUR_INSIDE; } namespace { @@ -275,7 +274,7 @@ bool findNextInset(DocIterator & dit, if (inset && find(codes.begin(), codes.end(), inset->lyxCode()) != codes.end() && (contents.empty() || - static_cast(inset)->getContents() == contents)) { + static_cast(inset)->getContents() == contents)) { dit = tmpdit; return true; }