mirror of
https://git.lyx.org/repos/lyx.git
synced 2024-11-10 20:04:46 +00:00
speed up preview a bit...
git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@4499 a592a061-630c-0410-9148-cb99ea01b6c8
This commit is contained in:
parent
c520bdbd89
commit
02b6d38f1a
@ -61,24 +61,13 @@ using std::getline;
|
|||||||
|
|
||||||
|
|
||||||
InsetFormula::InsetFormula()
|
InsetFormula::InsetFormula()
|
||||||
: par_(MathAtom(new MathHullInset))
|
: par_(MathAtom(new MathHullInset)), loader_(0)
|
||||||
{
|
{}
|
||||||
init();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
InsetFormula::InsetFormula(InsetFormula const & f)
|
|
||||||
: InsetFormulaBase(f), par_(f.par_), loader_(f.loader_.filename())
|
|
||||||
{
|
|
||||||
init();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
InsetFormula::InsetFormula(MathInsetTypes t)
|
InsetFormula::InsetFormula(MathInsetTypes t)
|
||||||
: par_(MathAtom(new MathHullInset(t)))
|
: par_(MathAtom(new MathHullInset(t))), loader_(0)
|
||||||
{
|
{}
|
||||||
init();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
InsetFormula::InsetFormula(string const & s)
|
InsetFormula::InsetFormula(string const & s)
|
||||||
@ -94,8 +83,8 @@ InsetFormula::InsetFormula(string const & s)
|
|||||||
par_ = MathAtom(new MathHullInset(LM_OT_SIMPLE));
|
par_ = MathAtom(new MathHullInset(LM_OT_SIMPLE));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
init();
|
|
||||||
metrics();
|
metrics();
|
||||||
|
updatePreview();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -167,6 +156,7 @@ void InsetFormula::read(Buffer const *, LyXLex & lex)
|
|||||||
{
|
{
|
||||||
mathed_parse_normal(par_, lex);
|
mathed_parse_normal(par_, lex);
|
||||||
metrics();
|
metrics();
|
||||||
|
updatePreview();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -189,7 +179,7 @@ void InsetFormula::draw(BufferView * bv, LyXFont const & font,
|
|||||||
MathPainterInfo pi(bv->painter());
|
MathPainterInfo pi(bv->painter());
|
||||||
|
|
||||||
if (canPreview()) {
|
if (canPreview()) {
|
||||||
pi.pain.image(x + 1, y - a + 1, w - 2, h - 2, *(loader_.image()));
|
pi.pain.image(x + 1, y - a + 1, w - 2, h - 2, *(loader_->image()));
|
||||||
} else {
|
} else {
|
||||||
pi.base.style = display() ? LM_ST_DISPLAY : LM_ST_TEXT;
|
pi.base.style = display() ? LM_ST_DISPLAY : LM_ST_TEXT;
|
||||||
pi.base.font = font;
|
pi.base.font = font;
|
||||||
@ -354,6 +344,8 @@ InsetFormula::localDispatch(BufferView * bv, kb_action action,
|
|||||||
result = InsetFormulaBase::localDispatch(bv, action, arg);
|
result = InsetFormulaBase::localDispatch(bv, action, arg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//updatePreview();
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -404,7 +396,7 @@ int InsetFormula::ascent(BufferView *, LyXFont const &) const
|
|||||||
const int a = par_->ascent();
|
const int a = par_->ascent();
|
||||||
if (!canPreview())
|
if (!canPreview())
|
||||||
return a + 1;
|
return a + 1;
|
||||||
return a + 1 - (par_->height() - loader_.image()->getHeight()) / 2;
|
return a + 1 - (par_->height() - loader_->image()->getHeight()) / 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -413,14 +405,14 @@ int InsetFormula::descent(BufferView *, LyXFont const &) const
|
|||||||
const int d = par_->descent();
|
const int d = par_->descent();
|
||||||
if (!canPreview())
|
if (!canPreview())
|
||||||
return d + 1;
|
return d + 1;
|
||||||
return d + 1 - (par_->height() - loader_.image()->getHeight()) / 2;
|
return d + 1 - (par_->height() - loader_->image()->getHeight()) / 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int InsetFormula::width(BufferView * bv, LyXFont const & font) const
|
int InsetFormula::width(BufferView * bv, LyXFont const & font) const
|
||||||
{
|
{
|
||||||
metrics(bv, font);
|
metrics(bv, font);
|
||||||
return canPreview() ? loader_.image()->getWidth() : par_->width();
|
return canPreview() ? loader_->image()->getWidth() : par_->width();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -436,85 +428,78 @@ MathInsetTypes InsetFormula::getType() const
|
|||||||
|
|
||||||
bool InsetFormula::canPreview() const
|
bool InsetFormula::canPreview() const
|
||||||
{
|
{
|
||||||
return lyxrc.preview && !par_->asNestInset()->editing()
|
return lyxrc.preview && loader_ && !par_->asNestInset()->editing()
|
||||||
&& loader_.status() == grfx::Ready;
|
&& loader_->status() == grfx::Ready;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void InsetFormula::statusChanged()
|
void InsetFormula::statusChanged()
|
||||||
{
|
{
|
||||||
//lyxerr << "### InsetFormula::statusChanged called!, status: "
|
lyxerr << "### InsetFormula::statusChanged called!, status: "
|
||||||
// << loader_.status() << "\n";
|
<< loader_->status() << "\n";
|
||||||
if (loader_.status() == grfx::Ready)
|
if (loader_->status() == grfx::Ready)
|
||||||
view()->updateInset(this, false);
|
view()->updateInset(this, false);
|
||||||
else if (loader_.status() == grfx::WaitingToLoad)
|
else if (loader_->status() == grfx::WaitingToLoad)
|
||||||
loader_.startLoading();
|
loader_->startLoading();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void InsetFormula::init()
|
void InsetFormula::updatePreview()
|
||||||
{
|
|
||||||
if (lyxrc.preview)
|
|
||||||
loader_.statusChanged.connect
|
|
||||||
(boost::bind(&InsetFormula::statusChanged, this));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// built some unique filename
|
|
||||||
string constructFileName(string const & data)
|
|
||||||
{
|
|
||||||
typedef std::map<string, int> cache_type;
|
|
||||||
static cache_type theCache;
|
|
||||||
static int theCounter = 0;
|
|
||||||
|
|
||||||
int number;
|
|
||||||
cache_type::const_iterator it = theCache.find(data);
|
|
||||||
if (it == theCache.end())
|
|
||||||
number = theCache[data] = theCounter++;
|
|
||||||
else
|
|
||||||
number = it->second;
|
|
||||||
|
|
||||||
ostringstream os;
|
|
||||||
os << number;
|
|
||||||
return os.str();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void InsetFormula::updatePreview() const
|
|
||||||
{
|
{
|
||||||
// nothing to be done if no preview requested
|
// nothing to be done if no preview requested
|
||||||
|
lyxerr << "### updatePreview() called\n";
|
||||||
if (!lyxrc.preview)
|
if (!lyxrc.preview)
|
||||||
return;
|
return;
|
||||||
//lyxerr << "### updatePreview() called\n";
|
|
||||||
|
|
||||||
// get LaTeX
|
// get LaTeX
|
||||||
ostringstream ls;
|
ostringstream ls;
|
||||||
WriteStream wi(ls, false, false);
|
WriteStream wi(ls, false, false);
|
||||||
par_->write(wi);
|
par_->write(wi);
|
||||||
string const data = ls.str();
|
string const data = ls.str();
|
||||||
string const base = constructFileName(data);
|
|
||||||
string const dir = OnlyPath(lyx::tempName());
|
|
||||||
string const file = dir + base + ".lyxpreview";
|
|
||||||
|
|
||||||
// everything is fine already
|
// the preview cache, maps contents to image loaders
|
||||||
if (loader_.filename() == file)
|
typedef std::map<string, boost::shared_ptr<grfx::Loader> > cache_type;
|
||||||
|
static cache_type theCache;
|
||||||
|
static int theCounter = 0;
|
||||||
|
|
||||||
|
// set our loader corresponding to our current data
|
||||||
|
cache_type::const_iterator it = theCache.find(data);
|
||||||
|
|
||||||
|
// is this old data?
|
||||||
|
if (it != theCache.end()) {
|
||||||
|
// we have already a loader, connect to it anyway
|
||||||
|
lyxerr << "### updatePreview(), old loader: " << loader_ << "\n";
|
||||||
|
loader_ = it->second.get();
|
||||||
|
loader_->statusChanged.connect
|
||||||
|
(boost::bind(&InsetFormula::statusChanged, this));
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// construct new file name
|
||||||
|
static string const dir = OnlyPath(lyx::tempName());
|
||||||
|
ostringstream os;
|
||||||
|
os << dir << theCounter++ << ".lyxpreview";
|
||||||
|
string file = os.str();
|
||||||
|
|
||||||
// the real work starts
|
// the real work starts
|
||||||
//lyxerr << "### updatePreview() called for " << file << "\n";
|
lyxerr << "### updatePreview(), new file " << file << "\n";
|
||||||
std::ofstream of(file.c_str());
|
std::ofstream of(file.c_str());
|
||||||
of << "\\batchmode"
|
of << "\\batchmode"
|
||||||
<< "\\documentclass{article}"
|
<< "\\documentclass{article}"
|
||||||
<< "\\usepackage{amssymb}"
|
<< "\\usepackage{amssymb}"
|
||||||
<< "\\thispagestyle{empty}"
|
<< "\\thispagestyle{empty}"
|
||||||
<< "\\pdfoutput=0"
|
<< "\\pdfoutput=0"
|
||||||
<< "\\begin{document}"
|
<< "\\begin{document}"
|
||||||
<< data
|
<< data
|
||||||
<< "\\end{document}\n";
|
<< "\\end{document}\n";
|
||||||
of.close();
|
of.close();
|
||||||
|
|
||||||
// now we are done, start actual loading we will get called back via
|
// now we are done, start actual loading we will get called back via
|
||||||
// InsetFormula::statusChanged() if this is finished
|
// InsetFormula::statusChanged() if this is finished
|
||||||
loader_.reset(file);
|
lyxerr << "### updatePreview(), new loader: " << loader_ << "\n";
|
||||||
|
theCache[data].reset(new grfx::Loader(file));
|
||||||
|
loader_ = theCache.find(data)->second.get();
|
||||||
|
loader_->startLoading();
|
||||||
|
loader_->statusChanged.connect(boost::bind(&InsetFormula::statusChanged, this));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -39,8 +39,6 @@ public:
|
|||||||
///
|
///
|
||||||
explicit InsetFormula(string const &);
|
explicit InsetFormula(string const &);
|
||||||
///
|
///
|
||||||
InsetFormula(InsetFormula const &);
|
|
||||||
///
|
|
||||||
int ascent(BufferView *, LyXFont const &) const;
|
int ascent(BufferView *, LyXFont const &) const;
|
||||||
///
|
///
|
||||||
int descent(BufferView *, LyXFont const &) const;
|
int descent(BufferView *, LyXFont const &) const;
|
||||||
@ -95,15 +93,13 @@ private:
|
|||||||
///
|
///
|
||||||
void statusChanged();
|
void statusChanged();
|
||||||
///
|
///
|
||||||
void init();
|
void updatePreview();
|
||||||
///
|
|
||||||
void updatePreview() const;
|
|
||||||
///
|
///
|
||||||
bool canPreview() const;
|
bool canPreview() const;
|
||||||
|
|
||||||
/// contents
|
/// contents
|
||||||
MathAtom par_;
|
MathAtom par_;
|
||||||
/// LaTeX preview
|
/// non owning pointer
|
||||||
mutable grfx::Loader loader_;
|
mutable grfx::Loader * loader_;
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
@ -158,8 +158,6 @@ void InsetFormulaBase::metrics(BufferView * bv) const
|
|||||||
mi.base.font = font_;
|
mi.base.font = font_;
|
||||||
mi.base.font.setColor(LColor::math);
|
mi.base.font.setColor(LColor::math);
|
||||||
par()->metrics(mi);
|
par()->metrics(mi);
|
||||||
if (lyxrc.preview)
|
|
||||||
updatePreview();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -118,6 +118,8 @@ public:
|
|||||||
virtual void revealCodes(BufferView *) const;
|
virtual void revealCodes(BufferView *) const;
|
||||||
///
|
///
|
||||||
virtual Inset::EDITABLE editable() const { return HIGHLY_EDITABLE; }
|
virtual Inset::EDITABLE editable() const { return HIGHLY_EDITABLE; }
|
||||||
|
///
|
||||||
|
virtual void updatePreview() {}
|
||||||
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
@ -138,8 +140,6 @@ protected:
|
|||||||
void metrics(BufferView * bv = 0) const;
|
void metrics(BufferView * bv = 0) const;
|
||||||
///
|
///
|
||||||
void handleFont(BufferView * bv, string const & arg, string const & font);
|
void handleFont(BufferView * bv, string const & arg, string const & font);
|
||||||
///
|
|
||||||
virtual void updatePreview() const {}
|
|
||||||
|
|
||||||
///
|
///
|
||||||
mutable int xo_;
|
mutable int xo_;
|
||||||
|
@ -77,6 +77,14 @@ MathCursor::MathCursor(InsetFormulaBase * formula, bool front)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
MathCursor::~MathCursor()
|
||||||
|
{
|
||||||
|
// ensure that 'notifyCursorLeave' is called
|
||||||
|
while (popLeft())
|
||||||
|
;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void MathCursor::push(MathAtom & t)
|
void MathCursor::push(MathAtom & t)
|
||||||
{
|
{
|
||||||
Cursor_.push_back(MathCursorPos(t.nucleus()));
|
Cursor_.push_back(MathCursorPos(t.nucleus()));
|
||||||
@ -103,8 +111,12 @@ void MathCursor::pushRight(MathAtom & t)
|
|||||||
bool MathCursor::popLeft()
|
bool MathCursor::popLeft()
|
||||||
{
|
{
|
||||||
//cerr << "Leaving atom to the left\n";
|
//cerr << "Leaving atom to the left\n";
|
||||||
if (depth() <= 1)
|
if (depth() <= 1) {
|
||||||
|
if (depth() == 1)
|
||||||
|
par()->notifyCursorLeaves();
|
||||||
return false;
|
return false;
|
||||||
|
}
|
||||||
|
par()->notifyCursorLeaves();
|
||||||
Cursor_.pop_back();
|
Cursor_.pop_back();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -113,8 +125,12 @@ bool MathCursor::popLeft()
|
|||||||
bool MathCursor::popRight()
|
bool MathCursor::popRight()
|
||||||
{
|
{
|
||||||
//cerr << "Leaving atom "; par()->write(cerr, false); cerr << " right\n";
|
//cerr << "Leaving atom "; par()->write(cerr, false); cerr << " right\n";
|
||||||
if (depth() <= 1)
|
if (depth() <= 1) {
|
||||||
|
if (depth() == 1)
|
||||||
|
par()->notifyCursorLeaves();
|
||||||
return false;
|
return false;
|
||||||
|
}
|
||||||
|
par()->notifyCursorLeaves();
|
||||||
Cursor_.pop_back();
|
Cursor_.pop_back();
|
||||||
posRight();
|
posRight();
|
||||||
return true;
|
return true;
|
||||||
|
@ -60,6 +60,8 @@ public:
|
|||||||
///
|
///
|
||||||
explicit MathCursor(InsetFormulaBase *, bool left);
|
explicit MathCursor(InsetFormulaBase *, bool left);
|
||||||
///
|
///
|
||||||
|
~MathCursor();
|
||||||
|
///
|
||||||
void insert(MathAtom const &);
|
void insert(MathAtom const &);
|
||||||
///
|
///
|
||||||
void insert(MathArray const &);
|
void insert(MathArray const &);
|
||||||
|
@ -244,6 +244,8 @@ public:
|
|||||||
virtual bool lock() const { return false; }
|
virtual bool lock() const { return false; }
|
||||||
/// access to the lock (only nest array have one)
|
/// access to the lock (only nest array have one)
|
||||||
virtual void lock(bool) {}
|
virtual void lock(bool) {}
|
||||||
|
/// get notification when the cursor leaves this inset
|
||||||
|
virtual void notifyCursorLeaves() {}
|
||||||
|
|
||||||
/// write LaTeX and Lyx code
|
/// write LaTeX and Lyx code
|
||||||
virtual void write(WriteStream & os) const;
|
virtual void write(WriteStream & os) const;
|
||||||
|
@ -5,6 +5,7 @@
|
|||||||
#include "math_nestinset.h"
|
#include "math_nestinset.h"
|
||||||
#include "math_cursor.h"
|
#include "math_cursor.h"
|
||||||
#include "math_mathmlstream.h"
|
#include "math_mathmlstream.h"
|
||||||
|
#include "formulabase.h"
|
||||||
#include "debug.h"
|
#include "debug.h"
|
||||||
#include "frontends/Painter.h"
|
#include "frontends/Painter.h"
|
||||||
|
|
||||||
@ -234,3 +235,11 @@ MathArray MathNestInset::glue() const
|
|||||||
ar.push_back(cell(i));
|
ar.push_back(cell(i));
|
||||||
return ar;
|
return ar;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void MathNestInset::notifyCursorLeaves()
|
||||||
|
{
|
||||||
|
//lyxerr << "leaving " << *this << "\n";
|
||||||
|
if (mathcursor)
|
||||||
|
mathcursor->formula()->updatePreview();
|
||||||
|
}
|
||||||
|
@ -57,6 +57,8 @@ public:
|
|||||||
bool lock() const;
|
bool lock() const;
|
||||||
/// access to the lock
|
/// access to the lock
|
||||||
void lock(bool);
|
void lock(bool);
|
||||||
|
/// get notification when the cursor leaves this inset
|
||||||
|
void notifyCursorLeaves();
|
||||||
|
|
||||||
/// direct access to the cell
|
/// direct access to the cell
|
||||||
MathArray & cell(idx_type);
|
MathArray & cell(idx_type);
|
||||||
|
Loading…
Reference in New Issue
Block a user