TexRow info in source panel and gotoCursor() for debugging

These features are active in DEVEL_VERSION when Debug is set to LATEX.

1. The TexRow information is prepended to the source panel.

2. Clicking on any line in the source triggers reverse search. (This would be an
interesting feature to implement on the user side, but we need a proper LFUN.)
This commit is contained in:
Guillaume Munch 2015-10-11 14:50:32 +01:00
parent 460a764b7f
commit 789745df7a
5 changed files with 68 additions and 16 deletions

View File

@ -2365,13 +2365,19 @@ int BufferView::scrollUp(int offset)
void BufferView::setCursorFromRow(int row)
{
setCursorFromRow(row, buffer_.texrow());
}
void BufferView::setCursorFromRow(int row, TexRow const & texrow)
{
int tmpid;
int tmppos;
pit_type newpit = 0;
pos_type newpos = 0;
buffer_.texrow().getIdFromRow(row, tmpid, tmppos);
texrow.getIdFromRow(row, tmpid, tmppos);
bool posvalid = (tmpid != -1);
if (posvalid) {

View File

@ -44,6 +44,7 @@ class PainterInfo;
class ParIterator;
class ParagraphMetrics;
class Point;
class TexRow;
class Text;
class TextMetrics;
@ -159,6 +160,8 @@ public:
/// set the cursor based on the given TeX source row.
void setCursorFromRow(int row);
///
void setCursorFromRow(int row, TexRow const & texrow);
/// set cursor to the given inset. Return true if found.
bool setCursorFromInset(Inset const *);

View File

@ -26,6 +26,7 @@
#include "support/debug.h"
#include "support/lassert.h"
#include "support/docstream.h"
#include "support/docstring_list.h"
#include "support/gettext.h"
#include <boost/crc.hpp>
@ -64,6 +65,11 @@ ViewSourceWidget::ViewSourceWidget()
this, SLOT(setViewFormat(int)));
connect(outputFormatCO, SIGNAL(activated(int)),
this, SLOT(contentsChanged()));
#ifdef DEVEL_VERSION
if (lyx::lyxerr.debugging(Debug::LATEX))
connect(viewSourceTV, SIGNAL(cursorPositionChanged()),
this, SLOT(gotoCursor()));
#endif
// setting the update timer
update_timer_->setSingleShot(true);
@ -89,7 +95,7 @@ ViewSourceWidget::ViewSourceWidget()
}
auto_ptr<TexRow> ViewSourceWidget::getContent(BufferView const * view,
void ViewSourceWidget::getContent(BufferView const * view,
Buffer::OutputWhat output, docstring & str, string const & format,
bool master)
{
@ -108,11 +114,10 @@ auto_ptr<TexRow> ViewSourceWidget::getContent(BufferView const * view,
if (par_begin > par_end)
swap(par_begin, par_end);
odocstringstream ostr;
auto_ptr<TexRow> texrow = view->buffer().getSourceCode(ostr, format,
texrow_ = view->buffer().getSourceCode(ostr, format,
par_begin, par_end + 1, output, master);
//ensure that the last line can always be selected in its full width
str = ostr.str() + "\n";
return texrow;
}
@ -164,6 +169,23 @@ void ViewSourceWidget::updateViewNow()
update_timer_->start(0);
}
namespace {
QString prependTexRow(TexRow const & texrow, QString const & content)
{
QStringList list = content.split(QChar('\n'));
docstring_list dlist;
for (QStringList::const_iterator it = list.begin(); it != list.end(); ++it)
dlist.push_back(from_utf8(fromqstr(*it)));
texrow.prepend(dlist);
QString qstr;
for (docstring_list::iterator it = dlist.begin(); it != dlist.end(); ++it)
qstr += toqstr(*it) + '\n';
return qstr;
}
} // anon namespace
void ViewSourceWidget::realUpdateView()
{
if (!bv_) {
@ -191,13 +213,18 @@ void ViewSourceWidget::realUpdateView()
output = Buffer::OnlyBody;
docstring content;
auto_ptr<TexRow> texrow = getContent(bv_, output, content, format,
masterPerspectiveCB->isChecked());
getContent(bv_, output, content, format, masterPerspectiveCB->isChecked());
QString old = document_->toPlainText();
QString qcontent = toqstr(content);
#ifdef DEVEL_VERSION
if (texrow_.get() && lyx::lyxerr.debugging(Debug::LATEX))
qcontent = prependTexRow(*texrow_, qcontent);
#endif
// prevent gotoCursor()
viewSourceTV->blockSignals(true);
bool const changed = setText(qcontent);
if (changed && !texrow.get()) {
if (changed && !texrow_.get()) {
// position-to-row is unavailable
// we jump to the first modification
const QChar * oc = old.constData();
@ -227,18 +254,18 @@ void ViewSourceWidget::realUpdateView()
//c.movePosition(QTextCursor::Right, QTextCursor::KeepAnchor,1);
viewSourceTV->setTextCursor(c);
} else if (texrow.get()) {
} else if (texrow_.get()) {
// Use the available position-to-row conversion to highlight
// the current selection in the source
int beg_row, end_row;
{
DocIterator beg = bv_->cursor().selectionBegin();
DocIterator end = bv_->cursor().selectionEnd();
std::pair<int,int> beg_rows = texrow->rowFromDocIterator(beg);
std::pair<int,int> beg_rows = texrow_->rowFromDocIterator(beg);
beg_row = beg_rows.first;
if (beg != end) {
end.backwardChar();
std::pair<int,int> end_rows = texrow->rowFromDocIterator(end);
std::pair<int,int> end_rows = texrow_->rowFromDocIterator(end);
end_row = end_rows.second;
} else {
end_row = beg_rows.second;
@ -290,9 +317,22 @@ void ViewSourceWidget::realUpdateView()
viewSourceTV->setTextCursor(c);
viewSourceTV->horizontalScrollBar()->setValue(h_scroll);
} // else if (texrow)
viewSourceTV->blockSignals(false);
}
// only used in DEVEL_MODE for debugging
// need a proper LFUN if we want to implement it in release mode
void ViewSourceWidget::gotoCursor()
{
if (!bv_ || !texrow_.get())
return;
int row = viewSourceTV->textCursor().blockNumber() + 1;
const_cast<BufferView *>(bv_)->setCursorFromRow(row, *texrow_);
}
void ViewSourceWidget::updateDefaultFormat()
{
if (!bv_)

View File

@ -62,6 +62,8 @@ public Q_SLOTS:
void updateDefaultFormat();
///
void contentsChanged();
///
void gotoCursor();
private Q_SLOTS:
/// update content
@ -69,10 +71,8 @@ private Q_SLOTS:
private:
/// Get the source code of selected paragraphs, or the whole document.
/// If TexRow is unavailable for the format then t is null.
std::auto_ptr<TexRow> getContent(BufferView const * view,
Buffer::OutputWhat output, docstring & str,
std::string const & format, bool master);
void getContent(BufferView const * view, Buffer::OutputWhat output,
docstring & str, std::string const & format, bool master);
///
BufferView const * bv_;
///
@ -83,6 +83,9 @@ private:
QString view_format_;
///
QTimer * update_timer_;
/// TexRow information from the last source view. If TexRow is unavailable
/// for the last format then texrow_ is null.
std::auto_ptr<TexRow> texrow_;
};