int KateLayoutCache::displayViewLine(const KTextEditor::Cursor& virtualCursor, bool limitToVisible) { KTextEditor::Cursor work = viewCacheStart(); // only try this with valid lines! if (work.isValid()) work.setLine(m_renderer->folding().lineToVisibleLine(work.line())); if (!work.isValid()) return virtualCursor.line(); int limit = m_textLayouts.count(); // Efficient non-word-wrapped path if (!m_renderer->view()->dynWordWrap()) { int ret = virtualCursor.line() - work.line(); if (limitToVisible && (ret < 0 || ret > limit)) return -1; else return ret; } if (work == virtualCursor) { return 0; } int ret = -(int)viewLine(viewCacheStart()); bool forwards = (work < virtualCursor); // FIXME switch to using ranges? faster? if (forwards) { while (work.line() != virtualCursor.line()) { ret += viewLineCount(m_renderer->folding().visibleLineToLine(work.line())); work.setLine(work.line() + 1); if (limitToVisible && ret > limit) return -1; } } else { while (work.line() != virtualCursor.line()) { work.setLine(work.line() - 1); ret -= viewLineCount(m_renderer->folding().visibleLineToLine(work.line())); if (limitToVisible && ret < 0) return -1; } } // final difference KTextEditor::Cursor realCursor = virtualCursor; realCursor.setLine(m_renderer->folding().visibleLineToLine(realCursor.line())); if (realCursor.column() == -1) realCursor.setColumn(m_renderer->doc()->lineLength(realCursor.line())); ret += viewLine(realCursor); if (limitToVisible && (ret < 0 || ret > limit)) return -1; return ret; }
// Zoom in and out according to the change in wheel delta. void QGLView::wheel(int delta) { if (d->options & QGLView::FOVZoom) { //Use field-of view as zoom (much like a traditional camera) qreal scale = qAbs(viewDelta(delta, delta).x()); if (delta < 0) scale = -scale; if (scale >= 0.0f) scale += 1.0f; else scale = 1.0f / (1.0f - scale); qreal fov = d->camera->fieldOfView(); if (fov != 0.0f) d->camera->setFieldOfView(d->camera->fieldOfView() / scale); else d->camera->setViewSize(d->camera->viewSize() / scale); } else { // enable this to get wheel navigation that actually zooms by moving the // camera back, as opposed to making the angle of view wider. QVector3D viewVector= camera()->eye() - camera()->center(); qreal zoomMag = viewVector.length(); qreal zoomIncrement = -float(delta) / 100.0f; if (!qFuzzyIsNull(zoomIncrement)) { zoomMag += zoomIncrement; if (zoomMag < 1.0f) zoomMag = 1.0f; QRay3D viewLine(camera()->center(), viewVector.normalized()); camera()->setEye(viewLine.point(zoomMag)); } } }
KateTextLayout KateLayoutCache::textLayout( const KTextEditor::Cursor & realCursor ) { /*if (realCursor >= viewCacheStart() && (realCursor < viewCacheEnd() || realCursor == viewCacheEnd() && !m_textLayouts.last().wrap())) foreach (const KateTextLayout& l, m_textLayouts) if (l.line() == realCursor.line() && (l.endCol() < realCursor.column() || !l.wrap())) return l;*/ return line(realCursor.line())->viewLine(viewLine(realCursor)); }
//----------------------------------------------------------------------------------------- void TestTransformation::wheel(int delta) { if (CCamera* pCamera = m_pView->getCurrentCamera()) { QVector3D viewVector = pCamera->getEyePosition() - pCamera->getCenter(); real zoomMag = viewVector.length(); real zoomIncrement = -real(delta) / 100.; if (!qFuzzyIsNull(zoomIncrement)) { zoomMag += zoomIncrement; if (zoomMag < 1.) zoomMag = 1.; CRay viewLine(pCamera->getCenter(), viewVector.normalized()); pCamera->setEyePosition(viewLine.point(zoomMag)); } } }
int KateLineLayout::widthOfLastLine( ) const { const KateTextLayout& lastLine = viewLine(viewLineCount() - 1); return lastLine.width() + lastLine.xOffset(); }