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:
André Pönitz 2002-06-27 18:12:50 +00:00
parent c520bdbd89
commit 02b6d38f1a
9 changed files with 94 additions and 84 deletions

View File

@ -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));
} }

View File

@ -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

View File

@ -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();
} }

View File

@ -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_;

View File

@ -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;

View File

@ -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 &);

View File

@ -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;

View File

@ -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();
}

View File

@ -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);